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)