Skip to content

Commit bd3e2d7

Browse files
authored
Merge branch 'main' into 3493-fix-dict-unflatten
2 parents 035a1b6 + c7effb1 commit bd3e2d7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+927
-98
lines changed

.fides/redis_dataset.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ dataset:
2020
data_categories: [system.operations]
2121
fidesops_meta:
2222
data_type: string[] # List of edges between the upstream collection and the current collection
23+
- name: EN_DATA_USE_MAP__<privacy_request_id>
24+
description: This map of traversed `Collection`s to associated `DataUse`s is stored and retrieved to be included in access request output packages.
25+
data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified
26+
fidesops_meta:
27+
data_type: object # Dict mapping `Collection` addresses -> set of associated `DataUse`s
28+
fields:
29+
- name: <dataset_name>:<collection_name> # `Collection` address
30+
data_qualifier: aggregated.anonymized.unlinked_pseudonymized.pseudonymized.identified
31+
data_categories: [system.operations]
32+
fidesops_meta:
33+
data_type: string[] # set of `DataUse`s associated with this `Collection`
2334
- name: EN_EMAIL_INFORMATION__<privacy_request_id>__<current_step>__<dataset_name>__<collection_name> # Usage: For building emails associated with email-connector datasets at the end of the privacy request. This encrypted raw information is retrieved from each relevant email-based collection and used to build a single email per email connector, with instructions on how to mask data on the given dataset.
2435
fidesops_meta:
2536
data_type: object # Stores how to locate and mask records for a given "email" collection.

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,16 @@ The types of changes are:
1919

2020
### Added
2121
- Empty state for when there are no relevant privacy notices in the privacy center [#3640](https://github.com/ethyca/fides/pull/3640)
22+
- GPC indicators in fides-js banner and modal [#3673](https://github.com/ethyca/fides/pull/3673)
23+
- Set `sslmode` to `prefer` if connecting to Redshift via ssh [#3685](https://github.com/ethyca/fides/pull/3685)
24+
- Include `data_use` and `data_category` metadata in `upload` of access results [#3674](https://github.com/ethyca/fides/pull/3674)
2225

2326
### Fixed
2427
- Render linebreaks in the Fides.js overlay descriptions, etc. [#3665](https://github.com/ethyca/fides/pull/3665)
28+
- Broken link to Fides docs site on the About Fides page in Admin UI [#3643](https://github.com/ethyca/fides/pull/3643)
29+
- Add Systems Applicable Filter to Privacy Experience List [#3654](https://github.com/ethyca/fides/pull/3654)
30+
31+
### Developer Experience
2532

2633
### Changed
2734
- Moved GPC preferences slightly earlier in Fides.js lifecycle [#3561](https://github.com/ethyca/fides/pull/3561)

clients/admin-ui/src/features/datastore-connections/system_portal_config/forms/fields/DatasetConfigField/DatasetConfigField.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,6 @@ const DatasetConfigField: React.FC<Props> = ({
270270
}}
271271
name={fieldName}
272272
options={dropdownOptions}
273-
isRequired
274273
onOpen={onOpen}
275274
isLoading={isLoading}
276275
/>

clients/admin-ui/src/features/system/system.slice.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const systemApi = baseApi.injectEndpoints({
4646
params: { resource_type: "system" },
4747
method: "DELETE",
4848
}),
49-
invalidatesTags: ["System", "Datastore Connection"],
49+
invalidatesTags: ["System", "Datastore Connection", "Privacy Notices"],
5050
}),
5151
upsertSystems: build.mutation<UpsertResponse, System[]>({
5252
query: (systems) => ({

clients/admin-ui/src/pages/management/about.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ const About: NextPage = () => {
7878
Please visit{" "}
7979
<Link
8080
color="complimentary.500"
81-
href="https://docs.ethyca.com/fides/overview"
81+
href="https://docs.ethyca.com"
8282
isExternal
8383
>
8484
docs.ethyca.com

clients/fides-js/src/components/CloseButton.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,10 @@ const CloseButton = ({
1313
className="fides-close-button"
1414
onClick={onClick}
1515
>
16-
<svg
17-
width="16"
18-
height="16"
19-
viewBox="0 0 16 16"
20-
fill="none"
21-
xmlns="http://www.w3.org/2000/svg"
22-
>
16+
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none">
2317
<path
24-
d="M7.99999 7.05732L11.3 3.75732L12.2427 4.69999L8.94266 7.99999L12.2427 11.3L11.3 12.2427L7.99999 8.94266L4.69999 12.2427L3.75732 11.3L7.05732 7.99999L3.75732 4.69999L4.69999 3.75732L7.99999 7.05732Z"
2518
fill="#2D3748"
19+
d="m8 7.057 3.3-3.3.943.943-3.3 3.3 3.3 3.3-.943.943-3.3-3.3-3.3 3.3-.943-.943 3.3-3.3-3.3-3.3.943-.943 3.3 3.3Z"
2620
/>
2721
</svg>
2822
</button>
Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { h, FunctionComponent, VNode } from "preact";
2+
import { getConsentContext } from "../lib/consent-context";
23
import { ExperienceConfig } from "../lib/consent-types";
34
import CloseButton from "./CloseButton";
5+
import { GpcBadge } from "./GpcBadge";
46

57
interface BannerProps {
68
experience: ExperienceConfig;
@@ -14,26 +16,40 @@ const ConsentBanner: FunctionComponent<BannerProps> = ({
1416
buttonGroup,
1517
onClose,
1618
bannerIsOpen,
17-
}) => (
18-
<div
19-
id="fides-banner-container"
20-
className={`fides-banner fides-banner-bottom ${
21-
bannerIsOpen ? "" : "fides-banner-hidden"
22-
} `}
23-
>
24-
<div id="fides-banner">
25-
<div id="fides-banner-inner">
26-
<CloseButton ariaLabel="Close banner" onClick={onClose} />
27-
<div id="fides-banner-title" className="fides-banner-title">
28-
{experience.title}
19+
}) => {
20+
const showGpcBadge = getConsentContext().globalPrivacyControl;
21+
return (
22+
<div
23+
id="fides-banner-container"
24+
className={`fides-banner fides-banner-bottom ${
25+
bannerIsOpen ? "" : "fides-banner-hidden"
26+
} `}
27+
>
28+
<div id="fides-banner">
29+
<div id="fides-banner-inner">
30+
<CloseButton ariaLabel="Close banner" onClick={onClose} />
31+
<div id="fides-banner-heading">
32+
<div id="fides-banner-title" className="fides-banner-title">
33+
{experience.title}
34+
</div>
35+
{showGpcBadge ? (
36+
<GpcBadge
37+
label="Global Privacy Control Signal"
38+
status="detected"
39+
/>
40+
) : null}
41+
</div>
42+
<div
43+
id="fides-banner-description"
44+
className="fides-banner-description"
45+
>
46+
{experience.description}
47+
</div>
48+
{buttonGroup}
2949
</div>
30-
<div id="fides-banner-description" className="fides-banner-description">
31-
{experience.description}
32-
</div>
33-
{buttonGroup}
3450
</div>
3551
</div>
36-
</div>
37-
);
52+
);
53+
};
3854

3955
export default ConsentBanner;

clients/fides-js/src/components/ConsentModal.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Attributes } from "../lib/a11y-dialog";
33
import { PrivacyNotice, ExperienceConfig } from "../lib/consent-types";
44
import NoticeToggles from "./NoticeToggles";
55
import CloseButton from "./CloseButton";
6+
import GpcInfo from "./GpcInfo";
67

78
type NoticeKeys = Array<PrivacyNotice["notice_key"]>;
89

@@ -51,6 +52,7 @@ const ConsentModal = ({
5152
>
5253
{experience.description}
5354
</p>
55+
<GpcInfo />
5456
<div className="fides-modal-notices">
5557
<NoticeToggles
5658
notices={notices}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { h } from "preact";
2+
import { GpcStatus, PrivacyNotice } from "../lib/consent-types";
3+
import { getConsentContext } from "../lib/consent-context";
4+
import { getGpcStatusFromNotice } from "../lib/consent-utils";
5+
6+
export const GpcBadge = ({
7+
label,
8+
status,
9+
}: {
10+
label: string;
11+
status: string;
12+
}) => (
13+
<span className="fides-gpc-label">
14+
{label}{" "}
15+
<span className={`fides-gpc-badge fides-gpc-badge-${status}`}>
16+
{status}
17+
</span>
18+
</span>
19+
);
20+
21+
export const GpcBadgeForNotice = ({
22+
value,
23+
notice,
24+
}: {
25+
value: boolean;
26+
notice: PrivacyNotice;
27+
}) => {
28+
const consentContext = getConsentContext();
29+
const status = getGpcStatusFromNotice({ value, notice, consentContext });
30+
31+
if (status === GpcStatus.NONE) {
32+
return null;
33+
}
34+
35+
return <GpcBadge label="Global Privacy Control" status={status.valueOf()} />;
36+
};
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { h } from "preact";
2+
import WarningIcon from "./WarningIcon";
3+
import { getConsentContext } from "../lib/consent-context";
4+
5+
const GpcInfo = () => {
6+
const context = getConsentContext();
7+
8+
if (!context.globalPrivacyControl) {
9+
return null;
10+
}
11+
12+
return (
13+
<div className="fides-gpc-banner">
14+
<div className="fides-gpc-warning">
15+
<WarningIcon />
16+
</div>
17+
<div>
18+
<p className="fides-gpc-header">Global Privacy Control detected</p>
19+
<p>
20+
Your global privacy control preference has been honored. You have been
21+
automatically opted out of data uses cases which adhere to global
22+
privacy control.
23+
</p>
24+
</div>
25+
</div>
26+
);
27+
};
28+
29+
export default GpcInfo;

clients/fides-js/src/components/NoticeToggles.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ConsentMechanism, PrivacyNotice } from "../lib/consent-types";
44
import Toggle from "./Toggle";
55
import Divider from "./Divider";
66
import { useDisclosure } from "../lib/hooks";
7+
import { GpcBadgeForNotice } from "./GpcBadge";
78

89
const NoticeToggle = ({
910
notice,
@@ -46,7 +47,9 @@ const NoticeToggle = ({
4647
className="fides-notice-toggle-trigger"
4748
>
4849
{notice.name}
50+
<GpcBadgeForNotice notice={notice} value={checked} />
4951
</span>
52+
5053
<Toggle
5154
name={notice.name || ""}
5255
id={notice.notice_key}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { h } from "preact";
2+
3+
const WarningIcon = () => (
4+
<svg
5+
xmlns="http://www.w3.org/2000/svg"
6+
width="18"
7+
height="18"
8+
fill="currentColor"
9+
>
10+
<path d="M9 12.05a.68.68 0 0 0-.68.7c0 .39.32.7.68.7.39 0 .68-.31.68-.7a.66.66 0 0 0-.68-.7Zm0-1.18c.26 0 .44-.2.44-.46V6.19c0-.26-.2-.47-.44-.47a.49.49 0 0 0-.47.47v4.22c0 .25.21.46.47.46Zm7.27 2.27-5.85-9.9c-.3-.5-.83-.8-1.42-.8-.6 0-1.12.3-1.42.8l-5.86 9.9c-.3.5-.3 1.1-.01 1.6.3.51.83.82 1.43.82h11.72c.6 0 1.13-.3 1.43-.82.29-.5.28-1.1-.02-1.6Zm-.82 1.1c-.1.25-.33.38-.62.38H3.14a.7.7 0 0 1-.61-.35.64.64 0 0 1 0-.65l5.86-9.9A.7.7 0 0 1 9 3.37a.7.7 0 0 1 .61.35l5.86 9.9c.1.2.12.44-.02.63Z" />
11+
</svg>
12+
);
13+
14+
export default WarningIcon;

clients/fides-js/src/components/fides.css

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
--fides-overlay-font-color: #4a5568;
99
--fides-overlay-font-color-dark: #2d3748;
1010
--fides-overlay-hover-color: #edf2f7;
11+
--fides-overlay-gpc-applied-background-color: #38a169;
12+
--fides-overlay-gpc-applied-text-color: white;
13+
--fides-overlay-gpc-overridden-background-color: #e53e3e;
14+
--fides-overlay-gpc-overridden-text-color: white;
1115
/* Buttons */
1216
--fides-overlay-primary-button-background-color: var(
1317
--fides-overlay-primary-color
@@ -143,6 +147,12 @@ div#fides-banner-container.fides-banner-top.fides-banner-hidden {
143147
}
144148
}
145149

150+
div#fides-banner-heading {
151+
display: flex;
152+
margin-right: 0.8em;
153+
align-items: center;
154+
}
155+
146156
div#fides-banner-title {
147157
font-size: var(--fides-overlay-font-size-title);
148158
font-weight: 600;
@@ -286,8 +296,8 @@ div#fides-modal .fides-modal-button-group {
286296

287297
.fides-close-button {
288298
position: absolute;
289-
top: 1em;
290-
right: 1em;
299+
top: 0.5em;
300+
right: 0.2em;
291301
cursor: pointer;
292302
background: none;
293303
border: none;
@@ -423,10 +433,15 @@ div#fides-modal .fides-modal-button-group {
423433
padding: 0.5em;
424434
display: flex;
425435
justify-content: space-between;
436+
min-height: 40px;
437+
align-items: center;
426438
}
427439

428440
.fides-notice-toggle .fides-notice-toggle-trigger {
429441
width: 100%;
442+
display: flex;
443+
justify-content: space-between;
444+
margin-right: 0.5em;
430445
}
431446

432447
.fides-notice-toggle .fides-notice-toggle-title:hover {
@@ -441,3 +456,48 @@ div#fides-modal .fides-modal-button-group {
441456
.fides-notice-toggle-expanded {
442457
background-color: var(--fides-overlay-row-hover-color);
443458
}
459+
460+
/* GPC */
461+
.fides-gpc-banner {
462+
border: 1px solid var(--fides-overlay-primary-color);
463+
border-radius: var(--fides-overlay-component-border-radius);
464+
display: flex;
465+
padding: 1.1em;
466+
margin-bottom: 1em;
467+
}
468+
469+
.fides-gpc-banner p {
470+
margin: 0;
471+
}
472+
473+
.fides-gpc-warning {
474+
color: var(--fides-overlay-primary-color);
475+
margin-right: 0.5em;
476+
}
477+
478+
.fides-gpc-header {
479+
font-weight: 700;
480+
}
481+
482+
.fides-gpc-label {
483+
font-weight: 600;
484+
font-size: 0.9em;
485+
}
486+
487+
.fides-gpc-badge {
488+
text-transform: uppercase;
489+
padding: 0 4px;
490+
font-weight: 700;
491+
border-radius: var(--fides-overlay-button-border-radius);
492+
}
493+
494+
.fides-gpc-badge-applied,
495+
.fides-gpc-badge-detected {
496+
background: var(--fides-overlay-gpc-applied-background-color);
497+
color: var(--fides-overlay-gpc-applied-text-color);
498+
}
499+
500+
.fides-gpc-badge-overridden {
501+
background: var(--fides-overlay-gpc-overridden-background-color);
502+
color: var(--fides-overlay-gpc-overridden-text-color);
503+
}

0 commit comments

Comments
 (0)