Skip to content

Conversation

@jack-gale-ethyca
Copy link
Contributor

@jack-gale-ethyca jack-gale-ethyca commented Jan 7, 2026

ENG-2303

Updates the privacy request error notification email template with new branding, improved copy, and enhanced UX in the notification configuration drawer.

Ticket ENG-2303

Description Of Changes

Email Template (privacy_request_error_notification.html)

  • Branding: Added Ethyca branded banner at the top with Minos background (#2b2e35) and Corinth logo (#fafafa)
  • Copy improvements:
    • Removed robotic language, made tone more conversational
    • Removed second sentence from intro paragraph
    • Removed red alert box section entirely
    • Removed error count from action paragraph (now focuses on next steps)
  • Styling: Updated to match other email templates with responsive design and dark mode support

Code Changes

Backend (message_dispatch_service.py)

  • Fixed bug where unsent_errors variable wasn't being passed to template
  • Added support for optional organization_name and company_logo_url variables

Frontend (ConfigureAlerts.tsx)

  • Refactored to Ant Design: Migrated from Chakra UI to Ant Design components for consistency
  • UX improvements:
    • Updated header to "DSR notifications"
    • Added description text at top (trimmed from original)
    • Moved placeholder text to InfoTooltip
    • Smaller toggle switch
    • Improved spacing and layout
    • Buttons moved to footer with proper spacing

Email Input Component (EmailChipList.tsx)

  • Refactored to work with new Ant Design form structure
  • Simplified props interface (no longer requires Formik FieldArray)
  • Uses default tag color for email chips

Steps to Confirm

  • Email template renders correctly with new styling
  • All form validation and submission flows work correctly
  • Email is readable when forwarded to Slack

Pre-Merge Checklist

  • Issue requirements met
  • All CI pipelines succeeded
  • CHANGELOG.md updated
    • Add a db-migration This indicates that a change includes a database migration label to the entry if your change includes a DB migration
    • Add a high-risk This issue suggests changes that have a high-probability of breaking existing code label to the entry if your change includes a high-risk change (i.e. potential for performance impact or unexpected regression) that should be flagged
    • Updates unreleased work already in Changelog, no new entry necessary
  • UX feedback:
    • All UX related changes have been reviewed by a designer
    • No UX review needed
  • Followup issues:
    • Followup issues created
    • No followup issues
  • Database migrations:
    • Ensure that your downrev is up to date with the latest revision on main
    • Ensure that your downgrade() migration is correct and works
      • If a downgrade migration is not possible for this change, please call this out in the PR description!
    • No migrations
  • Documentation:
    • Documentation complete, PR opened in fidesdocs
    • Documentation issue created in fidesdocs
    • If there are any new client scopes created as part of the pull request, remember to update public-facing documentation that references our scope registry
    • No documentation updates required

ENG-2303

Updates the privacy request error notification email template with new branding, improved copy, and enhanced UX in the notification configuration drawer.
@jack-gale-ethyca jack-gale-ethyca requested review from a team as code owners January 7, 2026 19:18
@jack-gale-ethyca jack-gale-ethyca requested review from galvana and lucanovera and removed request for a team January 7, 2026 19:18
@vercel
Copy link
Contributor

vercel bot commented Jan 7, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Review Updated (UTC)
fides-plus-nightly Ignored Ignored Jan 16, 2026 10:06pm
fides-privacy-center Ignored Ignored Jan 16, 2026 10:06pm

Request Review

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Jan 7, 2026

Greptile Summary

This PR updates the DSR notification UX with improved branding and migrates the frontend from Chakra UI/Formik to Ant Design/React state.

Key changes:

  • Email template redesigned with Ethyca branding, responsive layout, and dark mode support
  • Backend now passes organization_name and company_logo_url to templates (previously missing unsent_errors)
  • Frontend refactored from Formik to React state management with Ant Design components

Critical issue:

  • The ConfigureAlerts drawer no longer loads existing notification settings from the API. When users open the drawer, they always see empty defaults instead of their current configuration. This breaks the edit flow.

Confidence Score: 3/5

  • Not safe to merge - breaks existing notification configuration editing
  • The PR contains a critical functional regression where users cannot view or edit their existing notification settings. The drawer always shows defaults instead of loading current values from the API.
  • ConfigureAlerts.tsx needs the data loading logic restored before merge

Important Files Changed

Filename Overview
clients/admin-ui/src/features/privacy-requests/drawers/ConfigureAlerts.tsx Migrated from Formik/Chakra to React state/Ant Design, but loses ability to load existing notification settings
src/fides/api/service/messaging/message_dispatch_service.py Added support for optional organization_name and company_logo_url variables, fixed unsent_errors bug
src/fides/api/email_templates/templates/privacy_request_error_notification.html Complete redesign with Ethyca branding, improved styling, responsive design, and dark mode support

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

6 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

If you saved an email, then closed and reopened the tray, the email would disappear. this Fixes that.
@jack-gale-ethyca
Copy link
Contributor Author

@galvana There is technically a BE change here, cursor found a bug and updated it. If we don't want to include that we don't have to. LMK.

ConfigureAlerts.tsx:
Reorganized UI: global "Enable email notifications" toggle at top (defaults to ON)
Updated copy: "Email addresses", "Send notification after [N] error(s)" with help text
Form resets to defaults when drawer closes
Split useEffect: one for query enable, one for data population
Replaced div separators with Divider component
Added array safety check to prevent dummy emails
EmailChipList.tsx:
Added disabled prop support
Disables input and prevents email removal when disabled
ProtectedRoute.tsx:
Removed "/" from REDIRECT_IGNORES to fix 404 — unauthenticated users now redirect to login
Result: Clearer UX with notifications enabled by default, threshold controls frequency, and no dummy emails pre-seeded.
@galvana
Copy link
Contributor

galvana commented Jan 12, 2026

Hey @jack-gale-ethyca what was the BE bug that Cursor found?

@jack-gale-ethyca
Copy link
Contributor Author

@galvana

The PUT endpoint for updating privacy request notifications was inconsistent: it used a hardcoded ", " to split email addresses, while the GET endpoint used the EMAIL_JOIN_STRING constant. This could cause issues if the constant changed and made the code harder to maintain.

Code Changes Made
The fix changed line 735 in src/fides/api/api/v1/endpoints/privacy_request_endpoints.py:

Before:
return PrivacyRequestNotificationInfo( email_addresses=info.email.split(", "), # ❌ Hardcoded string notify_after_failures=info.notify_after_failures,)

After:
return PrivacyRequestNotificationInfo( email_addresses=info.email.split(EMAIL_JOIN_STRING), # ✅ Uses constant notify_after_failures=info.notify_after_failures,)

This aligns the PUT endpoint with the GET endpoint (line 674), which already used EMAIL_JOIN_STRING, ensuring consistent behavior and maintainability.

Curious if you agree?

Removed all BE code, redirects, etc.

Simplifies the privacy request error notification email template to plain text copy, removing all styling, branding, and HTML structure.
Changes
Removed all CSS styling and complex HTML structure
Removed branding elements (logos, banners, footer)
Removed test email functionality
Simplified to minimal HTML with plain text copy only
Updated email copy to the new messaging
Rationale
Mailgun handles header, footer, and formatting. The template now provides only the email body copy, allowing Mailgun to apply consistent branding and styling.
Email Copy
The template now contains:
Subject: Important information about your privacy request
Body: Notification about processing issues and guidance to review in the admin dashboard
This change ensures Mailgun can properly inject branding and formatting while maintaining the required notification content.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants