Skip to content

Commit 6566952

Browse files
authored
LJ 464: Update all FidesJS events with timestamp, and all FidesUIChanged events with extraDetails.trigger and extraDetails.preference (#5859)
1 parent 238bad5 commit 6566952

23 files changed

+1770
-147
lines changed

CHANGELOG.md

+4-1
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,11 @@ Changes can also be flagged with a GitHub label for tracking purposes. The URL o
4242
## [2.56.2](https://github.com/ethyca/fides/compare/2.56.1...2.56.2)
4343

4444
### Added
45-
- Fides GTM & event origination [#5821](https://github.com/ethyca/fides/pull/5821)
45+
- Update FidesJS to push all `FidesEvent` types to GTM (except `FidesInitializing`) [#5821](https://github.com/ethyca/fides/pull/5821)
4646
- Added a consent reporting table and consent lookup feature [#5839](https://github.com/ethyca/fides/pull/5839)
47+
- Added a high-precision `timestamp` to all `FidesEvents` from FidesJS SDK [#5859](https://github.com/ethyca/fides/pull/5859)
48+
- Added a `extraDetails.trigger` to `FidesUIChanged` events from FidesJS SDK with info about the UI element that triggered the event [#5859](https://github.com/ethyca/fides/pull/5859)
49+
- Added a `extraDetails.preference` to `FidesUIChanged` events from FidesJS SDK with info about the preference that was changed (notice, TCF purpose, TCF vendor, etc.) [#5859](https://github.com/ethyca/fides/pull/5859)
4750

4851
### Fixed
4952
- Addressed TCModel console error when opting into some purposes [#5850](https://github.com/ethyca/fides/pull/5850)

clients/fides-js/docs/interfaces/FidesEvent.md

+95-9
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,15 @@ User's current consent preferences; see [Fides.consent](Fides.md#consent) for de
9494
9595
User's current consent string; see [Fides.fides_string](Fides.md#fides_string) for detail.
9696

97+
#### timestamp?
98+
99+
> `optional` **timestamp**: `number`
100+
101+
High-precision timestamp from [performance.mark()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/mark)
102+
representing when this event was created. The timestamp is measured in milliseconds since page load.
103+
104+
May be undefined if the Performance API is not available.
105+
97106
#### extraDetails?
98107

99108
> `optional` **extraDetails**: `object`
@@ -118,23 +127,100 @@ Whether the user should be shown the consent experience. Only available on Fides
118127
119128
What consent method (if any) caused this event.
120129

121-
#### extraDetails.servingToggle?
130+
#### extraDetails.trigger?
131+
132+
> `optional` **trigger**: `object`
133+
134+
What UI element (if any) triggered this event.
135+
136+
#### extraDetails.trigger.type
137+
138+
> **type**: `"toggle"`
139+
140+
The type of element that triggered the event. Additional types may be
141+
added over time (e.g. "button", "link"), so expect this type to grow.
142+
143+
#### extraDetails.trigger.label?
144+
145+
> `optional` **label**: `string`
146+
147+
The UI label of the element that triggered the event.
148+
149+
#### extraDetails.trigger.checked?
150+
151+
> `optional` **checked**: `boolean`
152+
153+
The checked state of the element that triggered the event.
154+
Only present when type is "toggle".
155+
156+
#### extraDetails.preference?
157+
158+
> `optional` **preference**: `object`
159+
160+
Information about the specific preference being changed, if this event
161+
was triggered by a preference change.
162+
163+
##### Example
164+
165+
```ts
166+
// For a notice toggle:
167+
preference: {
168+
key: "advertising",
169+
type: "notice"
170+
}
171+
172+
// For a TCF purpose toggle:
173+
preference: {
174+
key: "tcf_purpose_consent_4",
175+
type: "tcf_purpose_consent"
176+
}
177+
178+
// For a TCF vendor toggle:
179+
preference: {
180+
key: "gvl.2",
181+
type: "tcf_vendor_consent",
182+
vendor_id: "gvl.2",
183+
vendor_list: "gvl",
184+
vendor_list_id: "2",
185+
vendor_name: "Captify"
186+
}
187+
```
188+
189+
#### extraDetails.preference.key
190+
191+
> **key**: `string`
192+
193+
The unique key identifying this preference
194+
195+
#### extraDetails.preference.type
196+
197+
> **type**: `"notice"` \| `"tcf_purpose_consent"` \| `"tcf_purpose_legitimate_interest"` \| `"tcf_special_feature"` \| `"tcf_vendor_consent"` \| `"tcf_vendor_legitimate_interest"`
198+
199+
The type of preference being changed
200+
201+
#### extraDetails.preference.vendor\_id?
202+
203+
> `optional` **vendor\_id**: `string`
204+
205+
The vendor ID if this is a vendor-related preference
206+
207+
#### extraDetails.preference.vendor\_list?
122208

123-
> `optional` **servingToggle**: `object`
209+
> `optional` **vendor\_list**: `"gvl"` \| `"gacp"` \| `"fds"`
124210
125-
What toggle (if any) caused this event.
211+
The vendor list type if this is a vendor-related preference
126212

127-
#### extraDetails.servingToggle.label
213+
#### extraDetails.preference.vendor\_list\_id?
128214

129-
> **label**: `string`
215+
> `optional` **vendor\_list\_id**: `string`
130216
131-
#### extraDetails.servingToggle.id
217+
The vendor list ID if this is a vendor-related preference
132218

133-
> **id**: `string`
219+
#### extraDetails.preference.vendor\_name?
134220

135-
#### extraDetails.servingToggle.checked
221+
> `optional` **vendor\_name**: `string`
136222
137-
> **checked**: `boolean`
223+
The vendor name if this is a vendor-related preference
138224

139225
#### Overrides
140226

clients/fides-js/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
"rollup-plugin-postcss": "^4.0.2",
7474
"rollup-plugin-visualizer": "^5.12.0",
7575
"ts-jest": "^29.1.5",
76-
"typedoc": "^0.26.2",
76+
"typedoc": "^0.26.11",
7777
"typedoc-plugin-markdown": "^4.1.0",
7878
"typescript": "^4.9.5",
7979
"typescript-plugin-css-modules": "^5.0.1"

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ComponentChildren, h, VNode } from "preact";
22

3-
import { FidesServingToggleDetails } from "../lib/events";
3+
import { FidesEventDetailsTrigger } from "../lib/events";
44
import { useDisclosure } from "../lib/hooks";
55
import Toggle from "./Toggle";
66

@@ -23,7 +23,7 @@ const DataUseToggle = ({
2323
checked: boolean;
2424
onToggle: (
2525
noticeKey: string,
26-
toggleDetails: FidesServingToggleDetails,
26+
triggerDetails: FidesEventDetailsTrigger,
2727
) => void;
2828
children?: ComponentChildren;
2929
badge?: string;

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

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { h } from "preact";
22

3-
import { FidesServingToggleDetails } from "../lib/events";
3+
import { FidesEventDetailsTrigger } from "../lib/events";
44

55
const Toggle = ({
66
label,
@@ -18,7 +18,7 @@ const Toggle = ({
1818
checked: boolean;
1919
onChange: (
2020
noticeKey: string,
21-
toggleDetails: FidesServingToggleDetails,
21+
triggerDetails: FidesEventDetailsTrigger,
2222
) => void;
2323
disabled?: boolean;
2424
onLabel?: string;
@@ -33,8 +33,11 @@ const Toggle = ({
3333
aria-label={label}
3434
className="fides-toggle-input"
3535
onChange={() => {
36-
const nextCheckedState = !checked;
37-
onChange(id, { id, label, checked: nextCheckedState });
36+
onChange(id, {
37+
type: "toggle",
38+
label,
39+
checked: !checked,
40+
});
3841
}}
3942
checked={checked}
4043
role="switch"

clients/fides-js/src/components/notices/NoticeOverlay.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -361,11 +361,12 @@ const NoticeOverlay: FunctionComponent<OverlayProps> = ({
361361
<NoticeToggles
362362
noticeToggles={noticeToggles}
363363
enabledNoticeKeys={draftEnabledNoticeKeys}
364-
onChange={(updatedKeys, toggleDetails) => {
364+
onChange={(updatedKeys, triggerDetails, preference) => {
365365
const eventExtraDetails: FidesEvent["detail"]["extraDetails"] =
366366
{
367367
servingComponent: "modal",
368-
servingToggle: toggleDetails,
368+
trigger: triggerDetails,
369+
preference,
369370
};
370371
setDraftEnabledNoticeKeys(updatedKeys);
371372
dispatchFidesEvent(

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

+19-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { h } from "preact";
22

33
import { GpcStatus } from "../../lib/consent-types";
4-
import { FidesServingToggleDetails } from "../../lib/events";
4+
import {
5+
FidesEventDetailsPreference,
6+
FidesEventDetailsTrigger,
7+
} from "../../lib/events";
58
import { DEFAULT_LOCALE, getCurrentLocale } from "../../lib/i18n";
69
import { useI18n } from "../../lib/i18n/i18n-context";
710
import DataUseToggle from "../DataUseToggle";
@@ -26,23 +29,34 @@ export const NoticeToggles = ({
2629
enabledNoticeKeys: Array<string>;
2730
onChange: (
2831
keys: Array<string>,
29-
toggleDetails: FidesServingToggleDetails,
32+
triggerDetails: FidesEventDetailsTrigger,
33+
preferenceDetails: FidesEventDetailsPreference,
3034
) => void;
3135
}) => {
3236
const { i18n } = useI18n();
3337
const handleToggle = (
3438
noticeKey: string,
35-
toggleDetails: FidesServingToggleDetails,
39+
triggerDetails: FidesEventDetailsTrigger,
3640
) => {
41+
const preferenceDetails: FidesEventDetailsPreference = {
42+
key: noticeKey,
43+
type: "notice",
44+
};
45+
3746
// Add the notice to list of enabled notices
3847
if (enabledNoticeKeys.indexOf(noticeKey) === -1) {
39-
onChange([...enabledNoticeKeys, noticeKey], toggleDetails);
48+
onChange(
49+
[...enabledNoticeKeys, noticeKey],
50+
triggerDetails,
51+
preferenceDetails,
52+
);
4053
}
4154
// Remove the notice from the list of enabled notices
4255
else {
4356
onChange(
4457
enabledNoticeKeys.filter((n) => n !== noticeKey),
45-
toggleDetails,
58+
triggerDetails,
59+
preferenceDetails,
4660
);
4761
}
4862
};

clients/fides-js/src/components/tcf/RecordsList.tsx

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { h, VNode } from "preact";
22

33
import { PrivacyNoticeTranslation } from "../../lib/consent-types";
4-
import { FidesServingToggleDetails } from "../../lib/events";
4+
import { FidesEventDetailsTrigger } from "../../lib/events";
55
import { DEFAULT_LOCALE, getCurrentLocale } from "../../lib/i18n";
66
import { useI18n } from "../../lib/i18n/i18n-context";
77
import DataUseToggle from "../DataUseToggle";
@@ -29,7 +29,7 @@ interface Props<T extends RecordListItem> {
2929
onToggle: (
3030
payload: string[],
3131
item: T,
32-
toggleDetails: FidesServingToggleDetails,
32+
triggerDetails: FidesEventDetailsTrigger,
3333
) => void;
3434
renderBadgeLabel?: (item: T) => string | undefined;
3535
hideToggles?: boolean;
@@ -50,16 +50,16 @@ const RecordsList = <T extends RecordListItem>({
5050
return null;
5151
}
5252

53-
const handleToggle = (item: T, toggleDetails: FidesServingToggleDetails) => {
53+
const handleToggle = (item: T, triggerDetails: FidesEventDetailsTrigger) => {
5454
const purposeId = `${item.id}`;
5555
if (enabledIds.indexOf(purposeId) !== -1) {
5656
onToggle(
5757
enabledIds.filter((e) => e !== purposeId),
5858
item,
59-
toggleDetails,
59+
triggerDetails,
6060
);
6161
} else {
62-
onToggle([...enabledIds, purposeId], item, toggleDetails);
62+
onToggle([...enabledIds, purposeId], item, triggerDetails);
6363
}
6464
};
6565

@@ -88,8 +88,8 @@ const RecordsList = <T extends RecordListItem>({
8888
key={item.id}
8989
title={item.bestTranslation?.title || getNameForItem(item)}
9090
noticeKey={`${item.id}`}
91-
onToggle={(_, extraDetails) => {
92-
handleToggle(item, extraDetails);
91+
onToggle={(_, triggerDetails) => {
92+
handleToggle(item, triggerDetails);
9393
}}
9494
checked={enabledIds.indexOf(`${item.id}`) !== -1}
9595
badge={renderBadgeLabel ? renderBadgeLabel(item) : undefined}

clients/fides-js/src/components/tcf/TcfFeatures.tsx

+17-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { h } from "preact";
22

33
import { PrivacyExperience } from "../../lib/consent-types";
4-
import { FidesServingToggleDetails } from "../../lib/events";
4+
import {
5+
FidesEventDetailsPreference,
6+
FidesEventDetailsTrigger,
7+
} from "../../lib/events";
58
import { useI18n } from "../../lib/i18n/i18n-context";
69
import { TCFFeatureRecord, TCFSpecialFeatureRecord } from "../../lib/tcf/types";
710
import EmbeddedVendorList from "./EmbeddedVendorList";
@@ -40,7 +43,8 @@ const TcfFeatures = ({
4043
enabledSpecialFeatureIds: string[];
4144
onChange: (
4245
payload: UpdateEnabledIds,
43-
toggleDetails: FidesServingToggleDetails,
46+
triggerDetails: FidesEventDetailsTrigger,
47+
preferenceDetails: FidesEventDetailsPreference,
4448
) => void;
4549
}) => {
4650
const { i18n } = useI18n();
@@ -51,9 +55,11 @@ const TcfFeatures = ({
5155
title={i18n.t("static.tcf.features")}
5256
items={allFeatures ?? []}
5357
enabledIds={enabledFeatureIds}
54-
onToggle={(newEnabledIds, _, toggleDetails) =>
55-
onChange({ newEnabledIds, modelType: "features" }, toggleDetails)
56-
}
58+
onToggle={() => {
59+
// Regular features cannot be toggled - they are notice-only.
60+
// The hideToggles prop ensures the UI doesn't show toggle controls,
61+
// and this no-op handler ensures no events are fired even if somehow triggered.
62+
}}
5763
renderToggleChild={(f) => (
5864
<FeatureChildren type="features" feature={f} />
5965
)}
@@ -64,10 +70,14 @@ const TcfFeatures = ({
6470
title={i18n.t("static.tcf.special_features")}
6571
items={allSpecialFeatures ?? []}
6672
enabledIds={enabledSpecialFeatureIds}
67-
onToggle={(newEnabledIds, _, toggleDetails) =>
73+
onToggle={(newEnabledIds, item, triggerDetails) =>
6874
onChange(
6975
{ newEnabledIds, modelType: "specialFeatures" },
70-
toggleDetails,
76+
triggerDetails,
77+
{
78+
key: `tcf_special_feature_${item.id}`,
79+
type: "tcf_special_feature",
80+
},
7181
)
7282
}
7383
renderToggleChild={(f) => (

clients/fides-js/src/components/tcf/TcfOverlay.tsx

+6-2
Original file line numberDiff line numberDiff line change
@@ -560,9 +560,13 @@ export const TcfOverlay = ({
560560
experience={experience}
561561
customNotices={privacyNoticesWithBestTranslation}
562562
enabledIds={draftIds}
563-
onChange={(updatedIds, toggleDetails) => {
563+
onChange={(updatedIds, triggerDetails, preference) => {
564564
const eventExtraDetails: FidesEvent["detail"]["extraDetails"] =
565-
{ servingComponent: "modal", servingToggle: toggleDetails };
565+
{
566+
servingComponent: "modal",
567+
trigger: triggerDetails,
568+
preference,
569+
};
566570
setDraftIds(updatedIds);
567571
dispatchFidesEvent(
568572
"FidesUIChanged",

0 commit comments

Comments
 (0)