Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
6a0d0a8
Update DSR notification UX
jack-gale-ethyca Jan 7, 2026
581de5c
Update CHANGELOG.md
jack-gale-ethyca Jan 7, 2026
2eb3522
Saved emails now persist
jack-gale-ethyca Jan 7, 2026
03feaf4
Updated UX and fixed greptile errors
jack-gale-ethyca Jan 12, 2026
8460f88
Merge branch 'main' into ENG-2303
galvana Jan 12, 2026
d411cd2
Update DSR notification email template
jack-gale-ethyca Jan 16, 2026
d84e04b
Updated tray styling
jack-gale-ethyca Jan 20, 2026
e849a9b
Revert changes to messaging.py
jack-gale-ethyca Jan 20, 2026
39ea8fd
Update DSR notification UX
jack-gale-ethyca Jan 7, 2026
57eb0b8
Update CHANGELOG.md
jack-gale-ethyca Jan 7, 2026
f41c6a2
Saved emails now persist
jack-gale-ethyca Jan 7, 2026
abe5c93
Remove incorrect async engine keepalive settings (#7171)
erosselli Jan 8, 2026
b9a08ee
ENG-2274 FE copy updates (#7185)
jack-gale-ethyca Jan 8, 2026
c67fc58
Python 3.13 🚂 (#7096)
johnewart Jan 8, 2026
d5e01ca
Remove old cypress-e2e tests (#7193)
lucanovera Jan 9, 2026
22244eb
Migrate consent reporting table to Ant Design (#7187)
gilluminate Jan 9, 2026
58a7e58
Add infrastructure monitor type to action center gated behind oktaMon…
dsill-ethyca Jan 9, 2026
670fcbf
ENG-2264 Add oauth method that uses async session (#7206)
erosselli Jan 9, 2026
49fc314
ENG-2307: Webhook headers (#7194)
tvandort Jan 9, 2026
f740d46
Allow publishing alpha tags to pypi (#7209)
erosselli Jan 9, 2026
f454135
Fix checkbox in create request modal (#7205)
lucanovera Jan 12, 2026
d026f71
Updated UX and fixed greptile errors
jack-gale-ethyca Jan 12, 2026
791b052
[ENG-2185] (#7133)
JadeCara Jan 12, 2026
818ab43
Update DSR notification email template
jack-gale-ethyca Jan 16, 2026
3e145c2
Updated tray styling
jack-gale-ethyca Jan 20, 2026
3280256
Merge branch 'ENG-2303' of https://github.com/ethyca/fides into ENG-2303
jack-gale-ethyca Jan 26, 2026
d144eb9
Made email addresses optional in Request notifications
jack-gale-ethyca Jan 26, 2026
6f18817
Removed unnecessary BE code
jack-gale-ethyca Jan 26, 2026
a4cc61b
Fixed linitng errors and FE dev rules
jack-gale-ethyca Jan 27, 2026
903399f
Updated change log
jack-gale-ethyca Jan 27, 2026
b3aba86
Update clients/admin-ui/src/features/privacy-requests/EmailChipList.tsx
jack-gale-ethyca Jan 28, 2026
65fa26e
Update clients/admin-ui/src/features/privacy-requests/EmailChipList.tsx
jack-gale-ethyca Jan 28, 2026
7fedd5c
Update clients/admin-ui/src/features/privacy-requests/drawers/Configu…
jack-gale-ethyca Jan 28, 2026
b12421c
Update clients/admin-ui/src/features/privacy-requests/drawers/Configu…
jack-gale-ethyca Jan 28, 2026
fe4fe9a
Update clients/admin-ui/src/features/privacy-requests/drawers/Configu…
jack-gale-ethyca Jan 28, 2026
fc16742
Update clients/admin-ui/src/features/privacy-requests/drawers/Configu…
jack-gale-ethyca Jan 28, 2026
011b4d2
Update clients/admin-ui/src/features/privacy-requests/drawers/Configu…
jack-gale-ethyca Jan 28, 2026
d4a704f
Update clients/admin-ui/src/features/privacy-requests/drawers/Configu…
jack-gale-ethyca Jan 28, 2026
9438292
Update clients/admin-ui/src/features/privacy-requests/drawers/Configu…
jack-gale-ethyca Jan 28, 2026
01b013a
Update clients/admin-ui/src/features/privacy-requests/drawers/Configu…
jack-gale-ethyca Jan 28, 2026
450d6cd
Update clients/admin-ui/src/features/privacy-requests/drawers/Configu…
jack-gale-ethyca Jan 28, 2026
1c7151a
Update clients/admin-ui/src/features/privacy-requests/drawers/Configu…
jack-gale-ethyca Jan 28, 2026
cda07e4
Removed changelog.md updates
jack-gale-ethyca Jan 28, 2026
e90641a
Merge branch 'ENG-2303' of https://github.com/ethyca/fides into ENG-2303
jack-gale-ethyca Jan 28, 2026
52fa89b
Fix lint errors and add changelog entry
jack-gale-ethyca Jan 28, 2026
41ddd3c
Merge branch 'main' into ENG-2303
jack-gale-ethyca Jan 28, 2026
128abbc
Fixed cancel bug
jack-gale-ethyca Jan 28, 2026
36b5a08
Merge branch 'main' into ENG-2303
jack-gale-ethyca Jan 28, 2026
a384b49
Fixing FE failing checks
jack-gale-ethyca Jan 28, 2026
6846928
Merge branch 'ENG-2303' of https://github.com/ethyca/fides into ENG-2303
jack-gale-ethyca Jan 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ Changes can also be flagged with a GitHub label for tracking purposes. The URL o
- Extending read-only DB configuration [#7139](https://github.com/ethyca/fides/pull/7139)
- Removed the ManualTaskLog table since it is un-used. This is a lossy migration, it can be `downgraded` but data will not be restored. [#7124](https://github.com/ethyca/fides/pull/7124) https://github.com/ethyca/fides/labels/db-migration
- Renamed staged resource diff status from 'approved' to 'reviewed' in database migration [#7159](https://github.com/ethyca/fides/pull/7159) https://github.com/ethyca/fides/labels/db-migration
- Update the privacy request notification email template with new branding, improved copy, and enhanced UX in the notification configuration drawer. [#7192](https://github.com/ethyca/fides/pull/7124)

### Developer Experience
- Deprecated Chakra UI exports with `Chakra` prefix, removed `Ant` prefix from Ant Design exports [#7173](https://github.com/ethyca/fides/pull/7173)
Expand Down
115 changes: 42 additions & 73 deletions clients/admin-ui/src/features/privacy-requests/EmailChipList.tsx
Original file line number Diff line number Diff line change
@@ -1,34 +1,16 @@
import {
ChakraFormControl as FormControl,
ChakraFormErrorMessage as FormErrorMessage,
ChakraFormLabel as FormLabel,
chakraForwardRef as forwardRef,
ChakraInput as Input,
ChakraTag as Tag,
ChakraTagCloseButton as TagCloseButton,
ChakraTagLabel as TagLabel,
ChakraVStack as VStack,
ChakraWrap as Wrap,
} from "fidesui";
import { FieldArrayRenderProps } from "formik";
import React, { useState } from "react";
import { Input, Tag } from "fidesui";
import React, { forwardRef, useState } from "react";

const EMAIL_REGEXP = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
const isValidEmail = (email: string) => EMAIL_REGEXP.test(email);

type EmailChipListProps = {
isRequired: boolean;
emails: string[];
onEmailsChange: (emails: string[]) => void;
};

const EmailChipList = forwardRef(
(
{
isRequired = false,
...props
}: FieldArrayRenderProps & EmailChipListProps,
ref,
) => {
const { emails }: { emails: string[] } = props.form.values;
const EmailChipList = forwardRef<HTMLInputElement, EmailChipListProps>(
({ emails, onEmailsChange }, ref) => {
const [inputValue, setInputValue] = useState("");

const emailChipExists = (email: string) => emails.includes(email);
Expand All @@ -37,8 +19,10 @@ const EmailChipList = forwardRef(
const validatedEmails = emailsToAdd
.map((e) => e.trim())
.filter((email) => isValidEmail(email) && !emailChipExists(email));
validatedEmails.forEach((email) => props.push(email));
setInputValue("");
if (validatedEmails.length > 0) {
onEmailsChange([...emails, ...validatedEmails]);
setInputValue("");
}
};

const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
Expand All @@ -59,56 +43,41 @@ const EmailChipList = forwardRef(
addEmails(pastedEmails);
};

const removeEmail = (emailToRemove: string) => {
onEmailsChange(emails.filter((email) => email !== emailToRemove));
};

return (
<FormControl
alignItems="baseline"
display="inline-flex"
isInvalid={!!props.form.errors[props.name]}
isRequired={isRequired}
>
<FormLabel fontSize="md" htmlFor="email">
Email
</FormLabel>
<VStack align="flex-start" w="inherit">
<Input
autoComplete="off"
placeholder="Type or paste email addresses separated by commas and press `Enter` or `Tab`..."
onChange={handleChange}
onKeyDown={handleKeyDown}
onPaste={handlePaste}
ref={ref}
size="sm"
type="email"
value={inputValue}
/>
<FormErrorMessage>
{props.form.errors[props.name] as string}
</FormErrorMessage>
{emails.length > 0 && (
<Wrap spacing={1} mb={3} pt="8px">
{emails.map((email, index) => (
<Tag
key={email}
borderRadius="full"
backgroundColor="primary.400"
color="white"
size="sm"
variant="solid"
>
<TagLabel>{email}</TagLabel>
<TagCloseButton
onClick={() => {
props.remove(index);
}}
/>
</Tag>
))}
</Wrap>
)}
</VStack>
</FormControl>
<div className="w-full">
<Input
autoComplete="off"
placeholder="Enter one or more email addresses"
onChange={handleChange}
onKeyDown={handleKeyDown}
onPaste={handlePaste}
ref={ref}
type="email"
value={inputValue}
/>
{emails.length > 0 && (
<div className="flex flex-wrap gap-2 mt-2">
{emails.map((email) => (
<Tag
key={email}
closable
onClose={() => removeEmail(email)}
color="default"
>
{email}
</Tag>
))}
</div>
)}
</div>
);
},
);

EmailChipList.displayName = "EmailChipList";

export default EmailChipList;
Loading
Loading