Skip to content

Commit

Permalink
Default PII to hidden on page load (#2388)
Browse files Browse the repository at this point in the history
  • Loading branch information
TheAndrewJackson authored Jan 31, 2023
1 parent 502d689 commit 5ccab10
Show file tree
Hide file tree
Showing 10 changed files with 82 additions and 50 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ The types of changes are:

* Home screen header scaling and responsiveness issues [#2200](https://github.com/ethyca/fides/pull/2277)
* Added a feature flag for the recent dataset classification UX changes [#2335](https://github.com/ethyca/fides/pull/2335)
* Privacy Center identity inputs validate even when they are optional. [#2308](https://github.com/ethyca/fides/pull/2308)
* The PII toggle defaults to false and PII will be hidden on page load [#2388](https://github.com/ethyca/fides/pull/2388)
* Fixed a CI bug caused by git security upgrades [#2441](https://github.com/ethyca/fides/pull/2441)
* Privacy Center
* Identity inputs validate even when they are optional. [#2308](https://github.com/ethyca/fides/pull/2308)
Expand Down
16 changes: 11 additions & 5 deletions clients/admin-ui/src/features/common/PII.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
import { useObscuredPII } from "privacy-requests/helpers";
import React from "react";
type PIIProps = {
data: string;
revealPII: boolean;
};

const PII: React.FC<{ data: string }> = ({ data }) => (
<>{useObscuredPII(data)}</>
);
const PII = ({ data, revealPII }: PIIProps) => {
const pii = revealPII ? data : data.replace(/./g, "*");
return (
// eslint-disable-next-line react/jsx-no-useless-fragment
<>{pii}</>
);
};

export default PII;
25 changes: 19 additions & 6 deletions clients/admin-ui/src/features/common/PIIToggle.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,26 @@
import { Switch } from "@fidesui/react";
import { setRevealPII } from "privacy-requests/privacy-requests.slice";
import React, { ChangeEvent } from "react";
import { useDispatch } from "react-redux";

const PIIToggle: React.FC = () => {
const dispatch = useDispatch();
type PIIToggleProps = {
revealPII: boolean;
onChange: (revealPII: boolean) => void;
};

const PIIToggle = ({ revealPII, onChange }: PIIToggleProps) => {
/*
The <Switch> onChange function only takes functions with ChangeEvent<HTMLInputElement>
as the input type. That's why the incoming function is being wrapped.
*/
const handleToggle = (event: ChangeEvent<HTMLInputElement>) =>
dispatch(setRevealPII(event.target.checked));
return <Switch colorScheme="secondary" onChange={handleToggle} />;
onChange(event.target.checked);

return (
<Switch
colorScheme="secondary"
isChecked={revealPII}
onChange={handleToggle}
/>
);
};

export default PIIToggle;
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Flex, Heading, Spacer } from "@fidesui/react";
import dynamic from "next/dynamic";
import * as React from "react";
import { useEffect } from "react";
import { useEffect, useState } from "react";

import { useDSRErrorAlert } from "./hooks/useDSRErrorAlert";
import RequestFilters from "./RequestFilters";
Expand All @@ -14,6 +14,7 @@ const ActionButtons = dynamic(

const PrivacyRequestsContainer: React.FC = () => {
const { processing } = useDSRErrorAlert();
const [revealPII, setRevealPII] = useState(false);

useEffect(() => {
processing();
Expand All @@ -28,8 +29,8 @@ const PrivacyRequestsContainer: React.FC = () => {
<Spacer />
<ActionButtons />
</Flex>
<RequestFilters />
<RequestTable />
<RequestFilters revealPII={revealPII} setRevealPII={setRevealPII} />
<RequestTable revealPII={revealPII} />
</>
);
};
Expand Down
18 changes: 13 additions & 5 deletions clients/admin-ui/src/features/privacy-requests/RequestFilters.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import {
} from "./privacy-requests.slice";
import { PrivacyRequestStatus } from "./types";

const useRequestFilters = () => {
const useRequestFilters = (setRevealPII: (revealPII: boolean) => void) => {
const filters = useSelector(selectPrivacyRequestFilters);
const token = useSelector(selectToken);
const dispatch = useDispatch();
Expand All @@ -56,7 +56,10 @@ const useRequestFilters = () => {
dispatch(setRequestFrom(event?.target.value));
const handleToChange = (event: React.ChangeEvent<HTMLInputElement>) =>
dispatch(setRequestTo(event?.target.value));
const handleClearAllFilters = () => dispatch(clearAllFilters());
const handleClearAllFilters = () => {
setRevealPII(false);
dispatch(clearAllFilters());
};
const handleDownloadClick = async () => {
let message;
try {
Expand Down Expand Up @@ -113,7 +116,12 @@ const useRequestFilters = () => {
};
};

const RequestFilters: React.FC = () => {
type RequestFiltersProps = {
revealPII: boolean;
setRevealPII: (revealPII: boolean) => void;
};

const RequestFilters = ({ revealPII, setRevealPII }: RequestFiltersProps) => {
const {
handleSearchChange,
handleStatusChange,
Expand All @@ -126,7 +134,7 @@ const RequestFilters: React.FC = () => {
selectedStatusList,
statusList,
to,
} = useRequestFilters();
} = useRequestFilters(setRevealPII);

return (
<Stack direction="row" spacing={4} mb={6}>
Expand Down Expand Up @@ -181,7 +189,7 @@ const RequestFilters: React.FC = () => {
<Text fontSize="xs" mr={2} size="sm">
Reveal PII
</Text>
<PIIToggle />
<PIIToggle revealPII={revealPII} onChange={setRevealPII} />
</Flex>
<Button
variant="ghost"
Expand Down
18 changes: 15 additions & 3 deletions clients/admin-ui/src/features/privacy-requests/RequestRow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,19 @@ const useRequestRow = (request: PrivacyRequestEntity) => {
};
};

const RequestRow: React.FC<{
type RequestRowProps = {
isChecked: boolean;
onCheckChange: (id: string, checked: boolean) => void;
request: PrivacyRequestEntity;
}> = ({ isChecked, onCheckChange, request }) => {
revealPII: boolean;
};

const RequestRow = ({
isChecked,
onCheckChange,
request,
revealPII,
}: RequestRowProps) => {
const {
hovered,
handleMenuOpen,
Expand Down Expand Up @@ -183,6 +191,7 @@ const RequestRow: React.FC<{
? request.identity.email || request.identity.phone_number || ""
: ""
}
revealPII={revealPII}
/>
</Text>
</Td>
Expand All @@ -191,7 +200,10 @@ const RequestRow: React.FC<{
</Td>
<Td py={1}>
<Text fontSize="xs">
<PII data={request.reviewer ? request.reviewer.username : ""} />
<PII
data={request.reviewer ? request.reviewer.username : ""}
revealPII={revealPII}
/>
</Text>
</Td>
<Td py={1}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@ import RequestRow from "./RequestRow";
import SortRequestButton from "./SortRequestButton";
import { PrivacyRequestEntity } from "./types";

const RequestTable: React.FC = () => {
type RequestTableProps = {
revealPII: boolean;
};

const RequestTable = ({ revealPII }: RequestTableProps) => {
const dispatch = useAppDispatch();
const filters = useAppSelector(selectPrivacyRequestFilters);
const { checkAll, errorRequests } = useAppSelector(selectRetryRequests);
Expand Down Expand Up @@ -104,6 +108,7 @@ const RequestTable: React.FC = () => {
isChecked={errorRequests.includes(request.id)}
onCheckChange={handleCheckChange}
request={request}
revealPII={revealPII}
/>
))}
</Tbody>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Divider, Flex, Heading, Text } from "@fidesui/react";
import { useState } from "react";

import PII from "../common/PII";
import PIIToggle from "../common/PIIToggle";
Expand All @@ -10,6 +11,7 @@ type SubjectIdentitiesProps = {

const SubjectIdentities = ({ subjectRequest }: SubjectIdentitiesProps) => {
const { identity } = subjectRequest;
const [revealPII, setRevealPII] = useState(false);

return (
<>
Expand All @@ -18,7 +20,7 @@ const SubjectIdentities = ({ subjectRequest }: SubjectIdentitiesProps) => {
Subject identities
</Heading>
<Flex flexShrink={0} alignItems="flex-start">
<PIIToggle />
<PIIToggle revealPII={revealPII} onChange={setRevealPII} />
<Text
fontSize="xs"
ml={2}
Expand All @@ -44,15 +46,21 @@ const SubjectIdentities = ({ subjectRequest }: SubjectIdentitiesProps) => {
Email:
</Text>
<Text color="gray.600" fontWeight="500" fontSize="sm">
<PII data={identity.email ? identity.email : ""} />
<PII
data={identity.email ? identity.email : ""}
revealPII={revealPII}
/>
</Text>
</Flex>
<Flex alignItems="flex-start">
<Text mb={4} mr={2} fontSize="sm" color="gray.900" fontWeight="500">
Mobile:
</Text>
<Text color="gray.600" fontWeight="500" fontSize="sm">
<PII data={identity.phone_number ? identity.phone_number : ""} />
<PII
data={identity.phone_number ? identity.phone_number : ""}
revealPII={revealPII}
/>
</Text>
</Flex>
</>
Expand Down
12 changes: 0 additions & 12 deletions clients/admin-ui/src/features/privacy-requests/helpers.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -125,17 +125,13 @@ export const selectRetryRequests = (state: RootState): RetryRequests => ({
errorRequests: state.subjectRequests.errorRequests,
});

export const selectRevealPII = (state: RootState) =>
state.subjectRequests.revealPII;

// Subject requests state (filters, etc.)
type SubjectRequestsState = {
checkAll: boolean;
errorRequests: string[];
from: string;
id: string;
page: number;
revealPII: boolean;
size: number;
sort_direction?: string;
sort_field?: string;
Expand All @@ -150,7 +146,6 @@ const initialState: SubjectRequestsState = {
from: "",
id: "",
page: 1,
revealPII: false,
size: 25,
to: "",
};
Expand All @@ -159,9 +154,8 @@ export const subjectRequestsSlice = createSlice({
name: "subjectRequests",
initialState,
reducers: {
clearAllFilters: ({ revealPII }) => ({
clearAllFilters: () => ({
...initialState,
revealPII,
}),
clearSortFields: (state) => ({
...state,
Expand Down Expand Up @@ -200,10 +194,6 @@ export const subjectRequestsSlice = createSlice({
checkAll: action.payload.checkAll,
errorRequests: action.payload.errorRequests,
}),
setRevealPII: (state, action: PayloadAction<boolean>) => ({
...state,
revealPII: action.payload,
}),
setSortDirection: (state, action: PayloadAction<string>) => ({
...state,
sort_direction: action.payload,
Expand Down Expand Up @@ -233,7 +223,6 @@ export const {
setRequestStatus,
setRequestTo,
setRetryRequests,
setRevealPII,
setSortDirection,
setSortField,
setVerbose,
Expand Down

0 comments on commit 5ccab10

Please sign in to comment.