diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3ed04def85b..9edd5205b55 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,7 @@ Changes can also be flagged with a GitHub label for tracking purposes. The URL o
## [2.81.0](https://github.com/ethyca/fides/compare/2.80.1..2.81.0)
### Added
+- Enabled LLM classifier toggle for Okta infrastructure monitors [#7641](https://github.com/ethyca/fides/pull/7641)
- Added questionnaire_tone_prompt column to privacy assessment config [#7563](https://github.com/ethyca/fides/pull/7563) https://github.com/ethyca/fides/labels/db-migration
- Chromatic builds for fidesui [#7485](https://github.com/ethyca/fides/pull/7485)
- Okta integration logo in action center [#7597](https://github.com/ethyca/fides/pull/7597)
@@ -81,6 +82,9 @@ Changes can also be flagged with a GitHub label for tracking purposes. The URL o
- Replaced Ant default icons with Carbon icons in Alert component [#7613](https://github.com/ethyca/fides/pull/7613)
- Migrated Organization encrypted columns from pgcrypto to AES-GCM [#7554](https://github.com/ethyca/fides/pull/7554) https://github.com/ethyca/fides/labels/db-migration
- Refined chart components with animation state management and dark theme card config [#7537](https://github.com/ethyca/fides/pull/7537)
+- Changed span to div in ExperienceDescription to expand the set of supported HTML tags in experience descriptions [#7502](https://github.com/ethyca/fides/pull/7502)
+- Un-deprecated GET /system/{fides_key}/connection endpoint [#7668](https://github.com/ethyca/fides/pull/7668)
+- Okta ux refactor [#7596](https://github.com/ethyca/fides/pull/7596)
### Developer Experience
- Added Carbon icon defaults for Ant Modal imperative API methods [#7569](https://github.com/ethyca/fides/pull/7569)
diff --git a/clients/admin-ui/cypress/e2e/action-center/infrastructure-systems.cy.ts b/clients/admin-ui/cypress/e2e/action-center/infrastructure-systems.cy.ts
index 38c73d664db..ee7830cc72b 100644
--- a/clients/admin-ui/cypress/e2e/action-center/infrastructure-systems.cy.ts
+++ b/clients/admin-ui/cypress/e2e/action-center/infrastructure-systems.cy.ts
@@ -502,19 +502,19 @@ describe("Action center infrastructure systems", () => {
cy.contains("button", "Actions").should("not.be.disabled");
});
- it("should show Add and Ignore actions on non-ignored tab", () => {
+ it("should show Approve and Ignore actions on non-ignored tab", () => {
cy.visit(`${ACTION_CENTER_ROUTE}/infrastructure/${monitorId}`);
cy.wait("@getInfrastructureSystems");
cy.get('input[type="checkbox"]').eq(1).check();
cy.contains("button", "Actions").click();
- cy.contains("Add").should("exist");
+ cy.contains("Approve").should("exist");
cy.contains("Ignore").should("exist");
cy.contains("Restore").should("not.exist");
});
- it("should show Add and Restore actions when filtering for ignored systems", () => {
+ it("should show Approve and Restore actions when filtering for ignored systems", () => {
stubInfrastructureSystems({
fixture:
"detection-discovery/results/infrastructure-systems-ignored-tab.json",
@@ -530,20 +530,20 @@ describe("Action center infrastructure systems", () => {
cy.get('input[type="checkbox"]').eq(1).check();
cy.contains("button", "Actions").click();
- cy.get(".ant-dropdown-menu-item").contains("Add").should("exist");
+ cy.get(".ant-dropdown-menu-item").contains("Approve").should("exist");
cy.get(".ant-dropdown-menu-item").contains("Restore").should("exist");
cy.get(".ant-dropdown-menu-item")
.contains("Ignore")
.should("not.exist");
});
- it("should perform bulk Add action with explicit selection", () => {
+ it("should perform bulk Approve action with explicit selection", () => {
cy.visit(`${ACTION_CENTER_ROUTE}/infrastructure/${monitorId}`);
cy.wait("@getInfrastructureSystems");
cy.get('input[type="checkbox"]').eq(1).check();
cy.contains("button", "Actions").click();
- cy.contains("Add").click();
+ cy.contains("Approve").click();
cy.wait("@bulkPromoteInfrastructureSystems").then((interception) => {
expect(interception.request.body).to.be.an("array");
@@ -596,7 +596,7 @@ describe("Action center infrastructure systems", () => {
cy.contains("selected").should("not.exist");
});
- it("should perform bulk Add action with select all mode", () => {
+ it("should perform bulk Approve action with select all mode", () => {
stubInfrastructureSystems({
fixture:
"detection-discovery/results/infrastructure-systems-large-dataset.json",
@@ -607,7 +607,7 @@ describe("Action center infrastructure systems", () => {
cy.contains("Select all").click();
cy.contains("button", "Actions").click();
- cy.contains("Add").click();
+ cy.contains("Approve").click();
cy.wait("@bulkPromoteInfrastructureSystems").then((interception) => {
expect(interception.request.body).to.have.property("filters");
@@ -621,7 +621,7 @@ describe("Action center infrastructure systems", () => {
cy.get('input[type="checkbox"]').eq(1).check();
cy.contains("button", "Actions").click();
- cy.contains("Add").click();
+ cy.contains("Approve").click();
cy.contains("button", "Actions").should("be.disabled");
});
@@ -639,7 +639,7 @@ describe("Action center infrastructure systems", () => {
cy.get('input[type="checkbox"]').eq(1).uncheck();
cy.contains("button", "Actions").click();
- cy.contains("Add").click();
+ cy.contains("Approve").click();
cy.wait("@bulkPromoteInfrastructureSystems").then((interception) => {
expect(interception.request.body).to.have.property("exclude_urns");
diff --git a/clients/admin-ui/src/features/common/nav/nav-config.tsx b/clients/admin-ui/src/features/common/nav/nav-config.tsx
index cab4d164f80..87c229459f7 100644
--- a/clients/admin-ui/src/features/common/nav/nav-config.tsx
+++ b/clients/admin-ui/src/features/common/nav/nav-config.tsx
@@ -130,7 +130,7 @@ export const NAV_CONFIG: NavConfigGroup[] = [
{
title: "Policies",
path: routes.POLICIES_ROUTE,
- requiresFlag: "alphaPolicies",
+ requiresFlag: "policies",
scopes: [ScopeRegistryEnum.POLICY_READ],
},
],
diff --git a/clients/admin-ui/src/features/data-discovery-and-detection/action-center/components/InfrastructureSystemActionsCell.tsx b/clients/admin-ui/src/features/data-discovery-and-detection/action-center/components/InfrastructureSystemActionsCell.tsx
index 4bd663c3db5..32a6e56ec39 100644
--- a/clients/admin-ui/src/features/data-discovery-and-detection/action-center/components/InfrastructureSystemActionsCell.tsx
+++ b/clients/admin-ui/src/features/data-discovery-and-detection/action-center/components/InfrastructureSystemActionsCell.tsx
@@ -22,7 +22,7 @@ interface InfrastructureSystemActionsCellProps {
allowIgnore?: boolean;
allowRestore?: boolean;
activeTab?: ActionCenterTabHash | null;
- addIcon?: React.ReactNode;
+ approveIcon?: React.ReactNode;
ignoreIcon?: React.ReactNode;
onPromoteSuccess?: () => void;
}
@@ -33,7 +33,7 @@ export const InfrastructureSystemActionsCell = ({
allowIgnore,
allowRestore,
activeTab,
- addIcon = ,
+ approveIcon = ,
ignoreIcon = ,
onPromoteSuccess,
}: InfrastructureSystemActionsCellProps) => {
@@ -52,7 +52,7 @@ export const InfrastructureSystemActionsCell = ({
const messageApi = useMessage();
- const handleAdd = async () => {
+ const handleApprove = async () => {
if (!system.urn) {
messageApi.error("Cannot promote: system URN is missing");
return;
@@ -125,20 +125,20 @@ export const InfrastructureSystemActionsCell = ({
const getActionTooltip = (
action:
- | InfrastructureSystemBulkActionType.ADD
+ | InfrastructureSystemBulkActionType.APPROVE
| InfrastructureSystemBulkActionType.RESTORE,
) => {
- const isAdd = action === InfrastructureSystemBulkActionType.ADD;
+ const isApprove = action === InfrastructureSystemBulkActionType.APPROVE;
if (!system.urn) {
- return `This system cannot be ${isAdd ? "promoted" : "restored"}: URN is missing.`;
+ return `This system cannot be ${isApprove ? "promoted" : "restored"}: URN is missing.`;
}
- if (isAdd && isIgnored) {
+ if (isApprove && isIgnored) {
return "Restore systems before adding to the inventory";
}
- if (!isAdd && !isIgnored) {
+ if (!isApprove && !isIgnored) {
return "You can only restore ignored systems";
}
- return isAdd ? "Add" : "Restore";
+ return isApprove ? "Approve" : "Restore";
};
return (
@@ -174,17 +174,19 @@ export const InfrastructureSystemActionsCell = ({
)}
-
+
diff --git a/clients/admin-ui/src/features/data-discovery-and-detection/action-center/components/InfrastructureSystemListItem.tsx b/clients/admin-ui/src/features/data-discovery-and-detection/action-center/components/InfrastructureSystemListItem.tsx
index 17ecce193cb..40cc42bc1de 100644
--- a/clients/admin-ui/src/features/data-discovery-and-detection/action-center/components/InfrastructureSystemListItem.tsx
+++ b/clients/admin-ui/src/features/data-discovery-and-detection/action-center/components/InfrastructureSystemListItem.tsx
@@ -153,34 +153,37 @@ export const InfrastructureSystemListItem = ({
}
description={
- {
- // Show sparkle icon if the data use was auto-detected (in data_uses)
- // and not manually assigned (not in user_assigned_data_uses)
- const isAutoDetectedFromCompass = item.data_uses?.includes(
- props.value as string,
- );
+ <>
+ {item.description}
+ {
+ // Show sparkle icon if the data use was auto-detected (in data_uses)
+ // and not manually assigned (not in user_assigned_data_uses)
+ const isAutoDetectedFromCompass = item.data_uses?.includes(
+ props.value as string,
+ );
- const handleClose = () => {
- const newDataUses =
- item.preferred_data_uses?.filter(
- (dataUse) => dataUse !== props.value,
- ) ?? [];
- handleUpdateDataUses(newDataUses);
- };
+ const handleClose = () => {
+ const newDataUses =
+ item.preferred_data_uses?.filter(
+ (dataUse) => dataUse !== props.value,
+ ) ?? [];
+ handleUpdateDataUses(newDataUses);
+ };
- return tagRender({
- ...props,
- isFromClassifier: isAutoDetectedFromCompass,
- onClose: handleClose,
- });
- }}
- onSelectDataUse={handleSelectDataUse}
- disabled={dataUsesDisabled}
- />
+ return tagRender({
+ ...props,
+ isFromClassifier: isAutoDetectedFromCompass,
+ onClose: handleClose,
+ });
+ }}
+ onSelectDataUse={handleSelectDataUse}
+ disabled={dataUsesDisabled}
+ />
+ >
}
/>
diff --git a/clients/admin-ui/src/features/data-discovery-and-detection/action-center/constants.ts b/clients/admin-ui/src/features/data-discovery-and-detection/action-center/constants.ts
index fcaa38629f5..012ab4a456d 100644
--- a/clients/admin-ui/src/features/data-discovery-and-detection/action-center/constants.ts
+++ b/clients/admin-ui/src/features/data-discovery-and-detection/action-center/constants.ts
@@ -126,7 +126,7 @@ export enum ConfidenceLevelLabel {
}
export enum InfrastructureSystemBulkActionType {
- ADD = "add",
+ APPROVE = "approve",
IGNORE = "ignore",
RESTORE = "restore",
}
diff --git a/clients/admin-ui/src/features/data-discovery-and-detection/action-center/hooks/useInfrastructureSystemsBulkActions.tsx b/clients/admin-ui/src/features/data-discovery-and-detection/action-center/hooks/useInfrastructureSystemsBulkActions.tsx
index 43f472fe35f..f8df89533b9 100644
--- a/clients/admin-ui/src/features/data-discovery-and-detection/action-center/hooks/useInfrastructureSystemsBulkActions.tsx
+++ b/clients/admin-ui/src/features/data-discovery-and-detection/action-center/hooks/useInfrastructureSystemsBulkActions.tsx
@@ -74,7 +74,7 @@ export const useInfrastructureSystemsBulkActions = ({
count = urns.length;
- if (action === InfrastructureSystemBulkActionType.ADD) {
+ if (action === InfrastructureSystemBulkActionType.APPROVE) {
result = await bulkPromoteIdentityProviderMonitorResultsMutation({
monitor_config_key: monitorId,
urns,
@@ -129,7 +129,7 @@ export const useInfrastructureSystemsBulkActions = ({
// Use a placeholder that will be updated from the response
count = 0;
- if (action === InfrastructureSystemBulkActionType.ADD) {
+ if (action === InfrastructureSystemBulkActionType.APPROVE) {
result = await bulkPromoteIdentityProviderMonitorResultsMutation({
monitor_config_key: monitorId,
bulkSelection: bulkSelectionPayload,
@@ -172,7 +172,7 @@ export const useInfrastructureSystemsBulkActions = ({
finalCount = 0;
}
- if (action === InfrastructureSystemBulkActionType.ADD) {
+ if (action === InfrastructureSystemBulkActionType.APPROVE) {
successMessage = `${finalCount} system${finalCount > 1 ? "s" : ""} ${finalCount > 1 ? "have" : "has"} been promoted to the system inventory.`;
} else if (action === InfrastructureSystemBulkActionType.IGNORE) {
successMessage = `${finalCount} system${finalCount > 1 ? "s" : ""} ${finalCount > 1 ? "have" : "has"} been ignored.`;
diff --git a/clients/admin-ui/src/features/data-discovery-and-detection/action-center/tables/DiscoveredInfrastructureSystemsTable.tsx b/clients/admin-ui/src/features/data-discovery-and-detection/action-center/tables/DiscoveredInfrastructureSystemsTable.tsx
index ed1abdb4592..f166d761427 100644
--- a/clients/admin-ui/src/features/data-discovery-and-detection/action-center/tables/DiscoveredInfrastructureSystemsTable.tsx
+++ b/clients/admin-ui/src/features/data-discovery-and-detection/action-center/tables/DiscoveredInfrastructureSystemsTable.tsx
@@ -1,4 +1,5 @@
import {
+ Alert,
Button,
Checkbox,
Dropdown,
@@ -146,6 +147,12 @@ export const DiscoveredInfrastructureSystemsTable = ({
return (
+
{
- if (isIgnoredTab) {
- return [
- {
- key: InfrastructureSystemBulkActionType.ADD,
- label: "Add",
- onClick: () => onBulkAction(InfrastructureSystemBulkActionType.ADD),
- disabled: isBulkActionInProgress,
- },
- {
- key: InfrastructureSystemBulkActionType.RESTORE,
- label: "Restore",
- onClick: () => onBulkAction(InfrastructureSystemBulkActionType.RESTORE),
- disabled: isBulkActionInProgress,
- },
- ];
- }
-
- return [
- {
- key: InfrastructureSystemBulkActionType.ADD,
- label: "Add",
- onClick: () => onBulkAction(InfrastructureSystemBulkActionType.ADD),
- disabled: isBulkActionInProgress,
- },
- ...(allowIgnore
- ? [
- {
- key: InfrastructureSystemBulkActionType.IGNORE,
- label: "Ignore",
- onClick: () =>
- onBulkAction(InfrastructureSystemBulkActionType.IGNORE),
- disabled: isBulkActionInProgress,
- },
- ]
- : []),
- ];
-};
+}: GetBulkActionsMenuItemsConfig): MenuProps["items"] => [
+ {
+ key: APPROVE,
+ label: "Approve",
+ onClick: () => onBulkAction(APPROVE),
+ disabled: isBulkActionInProgress,
+ },
+ ...(isIgnoredTab
+ ? [
+ {
+ key: RESTORE,
+ label: "Restore",
+ onClick: () => onBulkAction(RESTORE),
+ disabled: isBulkActionInProgress,
+ },
+ ]
+ : []),
+ ...(allowIgnore
+ ? [
+ {
+ key: IGNORE,
+ label: "Ignore",
+ onClick: () => onBulkAction(IGNORE),
+ disabled: isBulkActionInProgress,
+ },
+ ]
+ : []),
+];
export const shouldAllowIgnore = (
activeDiffStatusFilters: DiffStatus[] | DiffStatus | undefined,
diff --git a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureMonitorForm.tsx b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureMonitorForm.tsx
index 720e33dca12..2b7e3891ade 100644
--- a/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureMonitorForm.tsx
+++ b/clients/admin-ui/src/features/integrations/configure-monitor/ConfigureMonitorForm.tsx
@@ -9,10 +9,6 @@ import { useEffect, useState } from "react";
import { LlmModelSelector } from "~/features/common/form/LlmModelSelector";
import { enumToOptions } from "~/features/common/helpers";
import { formatUser } from "~/features/common/utils";
-import {
- getMonitorType,
- MONITOR_TYPES,
-} from "~/features/data-discovery-and-detection/action-center/utils/getMonitorType";
import { useGetSystemByFidesKeyQuery } from "~/features/system";
import { useGetAllUsersQuery } from "~/features/user-management";
import {
@@ -100,16 +96,6 @@ const ConfigureMonitorForm = ({
}) => {
const isEditing = !!monitor;
- const isInfrastructureMonitor =
- getMonitorType(integrationOption.identifier as ConnectionType) ===
- MONITOR_TYPES.INFRASTRUCTURE;
-
- /**
- * Show the LLM classifier option if the monitor is not an infrastructure monitor.
- * Infrastructure monitors (e.g., Okta) don't use classification.
- */
- const showLLMOption = !isInfrastructureMonitor;
-
const [form] = Form.useForm();
const { data: systemData, isLoading: isLoadingSystem } =
useGetSystemByFidesKeyQuery(integrationSystem || skipToken);
@@ -277,7 +263,6 @@ const ConfigureMonitorForm = ({
/>
diff --git a/clients/admin-ui/src/flags.json b/clients/admin-ui/src/flags.json
index 3b4777657fe..31d43385139 100644
--- a/clients/admin-ui/src/flags.json
+++ b/clients/admin-ui/src/flags.json
@@ -70,8 +70,8 @@
"test": false,
"production": false
},
- "alphaPolicies": {
- "label": "Alpha DSR Policies",
+ "policies": {
+ "label": "DSR Policies",
"description": "Privacy request policies management",
"development": true,
"test": true,
diff --git a/clients/fides-js/src/components/ExperienceDescription.tsx b/clients/fides-js/src/components/ExperienceDescription.tsx
index c92ee202237..dc19e11d4b9 100644
--- a/clients/fides-js/src/components/ExperienceDescription.tsx
+++ b/clients/fides-js/src/components/ExperienceDescription.tsx
@@ -13,9 +13,10 @@ const renderString = (string: string, allowHTMLDescription: boolean | null) => {
// NOTE: We sanitize these descriptions server-side when configuring the
// PrivacyExperience, so it's safe to trust these
return allowHTMLDescription ? (
-
) : (
stripHtml(string).trim()
diff --git a/clients/fides-js/src/components/fides.css b/clients/fides-js/src/components/fides.css
index 1a5b1587005..65243affd8d 100644
--- a/clients/fides-js/src/components/fides.css
+++ b/clients/fides-js/src/components/fides.css
@@ -254,6 +254,10 @@ div#fides-banner-heading {
font-weight: 600;
}
+.fides-experience-description-part {
+ display: contents;
+}
+
div#fides-banner-notices {
margin-top: 16px;
}
diff --git a/src/fides/api/v1/endpoints/system.py b/src/fides/api/v1/endpoints/system.py
index f76e4f386ef..0a75a95428a 100644
--- a/src/fides/api/v1/endpoints/system.py
+++ b/src/fides/api/v1/endpoints/system.py
@@ -103,17 +103,11 @@
],
status_code=HTTP_200_OK,
response_model=Page[ConnectionConfigurationResponse],
- deprecated=True,
)
def get_system_connections(
fides_key: str, params: Params = Depends(), db: Session = Depends(deps.get_db)
) -> AbstractPage[ConnectionConfigurationResponse]:
- """
- Return all the connection configs related to a system.
-
- Deprecated: Use GET /connection with `linked_systems` in the response,
- or GET /connection/{connection_key}/system-links to manage links directly.
- """
+ """Return all the connection configs related to a system."""
system = get_system(db, fides_key)
query = (
ConnectionConfig.query(db)