Skip to content

Conversation

@jpople
Copy link
Contributor

@jpople jpople commented Nov 26, 2025

Ticket ENG-1262

See #6898 for description.

Pre-Merge Checklist

  • Issue requirements met
  • All CI pipelines succeeded
  • CHANGELOG.md updated
    • Add a db-migration This indicates that a change includes a database migration label to the entry if your change includes a DB migration
    • Add a high-risk This issue suggests changes that have a high-probability of breaking existing code label to the entry if your change includes a high-risk change (i.e. potential for performance impact or unexpected regression) that should be flagged
    • Updates unreleased work already in Changelog, no new entry necessary
  • UX feedback:
    • All UX related changes have been reviewed by a designer
    • No UX review needed
  • Followup issues:
    • Followup issues created
    • No followup issues
  • Database migrations:
    • Ensure that your downrev is up to date with the latest revision on main
    • Ensure that your downgrade() migration is correct and works
      • If a downgrade migration is not possible for this change, please call this out in the PR description!
    • No migrations
  • Documentation:
    • Documentation complete, PR opened in fidesdocs
    • Documentation issue created in fidesdocs
    • If there are any new client scopes created as part of the pull request, remember to update public-facing documentation that references our scope registry
    • No documentation updates required

@jpople jpople requested a review from a team as a code owner November 26, 2025 20:04
@jpople jpople requested review from gilluminate and removed request for a team November 26, 2025 20:04
@vercel
Copy link

vercel bot commented Nov 26, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
fides-plus-nightly Error Error Nov 26, 2025 8:04pm
1 Skipped Deployment
Project Deployment Preview Comments Updated (UTC)
fides-privacy-center Ignored Ignored Nov 26, 2025 8:04pm

@greptile-apps
Copy link
Contributor

greptile-apps bot commented Nov 26, 2025

Greptile Overview

Greptile Summary

This PR implements custom taxonomy UI improvements that allow custom fields to be applied to custom taxonomies and enable using taxonomy keys as field types. The primary changes involve migrating from strict enum types (ResourceTypes, AllowedTypes) to flexible string-based types that can accept both legacy enum values and custom taxonomy keys. The PR introduces new API types for Identity Provider applications (Okta integration), adds custom field management directly within taxonomy editing interfaces, and updates numerous components to support the expanded custom taxonomy functionality. Key additions include CustomTaxonomySelect, PropagationPolicyKey enum, and enhanced table columns for identity provider metadata display.

Important Files Changed

Filename Score Overview
clients/admin-ui/src/types/api/models/CustomFieldDefinition.ts 5/5 Updates field_type and resource_type to accept both enum and string types for custom taxonomy support
clients/admin-ui/src/features/custom-fields/CustomFieldForm.tsx 4/5 Major refactor adding AutoComplete for taxonomy selection and dynamic form fields
clients/admin-ui/src/features/taxonomy/components/CustomTaxonomyDetails.tsx 4/5 Adds inline custom field management functionality to taxonomy editing interface
clients/admin-ui/src/features/taxonomy/components/TaxonomyCustomFieldsForm.tsx 4/5 Updates form to conditionally render taxonomy selectors vs text inputs based on field type
clients/admin-ui/src/features/plus/plus.slice.ts 4/5 Major refactor of custom field API to support string resource types and handle 404 responses
clients/admin-ui/src/features/custom-fields/CustomFieldFormValues.ts 5/5 Updates interface to support flexible string-based field types and adds value_type property
clients/admin-ui/src/features/common/custom-fields/hooks.ts 4/5 Modifies custom fields hook to accept any string as resource type instead of enum
clients/admin-ui/src/features/data-discovery-and-detection/discovery-detection.slice.ts 5/5 Adds comprehensive Identity Provider Monitor API endpoints for Okta integration
clients/admin-ui/src/types/api/models/IdentityProviderApplicationMetadata.ts 5/5 New type definition for Identity Provider application metadata structure
clients/admin-ui/src/features/user-management/UserManagementTable.tsx 4/5 Major refactor from custom table to Ant Design Table with search and role-based controls

Confidence score: 4/5

  • This PR is moderately complex with significant architectural changes but appears well-structured and follows established patterns
  • Score reflects the large scope of changes (90+ files) and type system migration which could introduce subtle compatibility issues, plus some unused imports and inconsistent return types in new hooks
  • Pay close attention to the type system migration from enums to string unions, the new Identity Provider Monitor endpoints, and the custom field form refactoring which introduces complex conditional rendering logic

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

81 files reviewed, 12 comments

Edit Code Review Agent Settings | Greptile

import { isIdentityProviderColumns } from "../utils/columnBuilders";

interface UseDiscoveredInfrastructureSystemsColumnsProps {
isOktaApp?: boolean;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logic: The isOktaApp prop is defined in the interface but not used in the hook implementation. Is the isOktaApp prop intended to be passed to the isIdentityProviderColumns function or used elsewhere?

if (customFields.isEnabled && resourceType) {
if (customFields.isEnabled) {
const customFieldValues = customFieldsForm.getFieldsValue();
console.log("customFieldValues", customFieldValues);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Debug console.log should be removed before merging to production

import type { Constraint } from "./Constraint";
import type { DiffStatus } from "./DiffStatus";
import { IdentityProviderApplicationMetadata } from "./IdentityProviderApplicationMetadata";
import type { ResourceError } from "./ResourceError";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: The ResourceError import is unused in this file and should be removed to keep imports clean.

Suggested change
import type { ResourceError } from "./ResourceError";
import { IdentityProviderApplicationMetadata } from "./IdentityProviderApplicationMetadata";

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

label: group.name,
}));

// eslint-disable-next-line jsx-a11y/control-has-associated-label
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: This eslint disable comment appears unnecessary since the Select component from Ant Design should properly handle accessibility labels through its internal implementation and the placeholder prop provides accessible context.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment on lines +39 to +41
if (isCustomTaxonomiesLoading) {
return { valueTypeOptions, customTaxonomies: [] };
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logic: return type is inconsistent - returns customTaxonomies when loading but not in the final return

Comment on lines +75 to +78
if (!taxonomyType || !fidesKey) {
messageApi.error("Taxonomy type not found");
return;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Error handling could be more specific - 'Taxonomy type not found' message appears when either taxonomyType or fidesKey is missing, but the message doesn't distinguish between these cases

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

"app_type": "SAML_2_0",
"status": "ACTIVE",
"created": "2023-06-15T09:00:00Z",
"sign_on_url": "https://company.okta.com/app/salesforce/sso/saml",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Uses real domain (company.okta.com) instead of reserved test domain

Suggested change
"sign_on_url": "https://company.okta.com/app/salesforce/sso/saml",
"sign_on_url": "https://company.example.com/app/salesforce/sso/saml",

Context Used: Context from dashboard - .cursor/rules/sensitive-info-protection.mdc (source)

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

"created": "2023-06-15T09:00:00Z",
"sign_on_url": "https://company.okta.com/app/salesforce/sso/saml",
"vendor_match_confidence": "medium",
"vendor_logo_url": "https://logo.clearbit.com/salesforce.com"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Uses real domain (salesforce.com) for logo URL instead of reserved test domain

Suggested change
"vendor_logo_url": "https://logo.clearbit.com/salesforce.com"
"vendor_logo_url": "https://logo.clearbit.com/example.com"

Context Used: Context from dashboard - .cursor/rules/sensitive-info-protection.mdc (source)

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

const { data, isLoading, isFetching } = useGetAllUsersQuery({
page: pageIndex,
size: pageSize,
username: searchQuery || undefined,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Consider using nullish coalescing operator (??) instead of logical OR since empty string is a valid search query

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Comment on lines +31 to +41
const permissionsLabels: string[] = [];
if (userPermissions && userPermissions.roles) {
userPermissions.roles.forEach((permissionRole) => {
const matchingRole = ROLES.find(
(role) => role.roleKey === permissionRole,
);
if (matchingRole) {
permissionsLabels.push(matchingRole.permissions_label);
}
});
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

style: Consider using filter and map chain instead of imperative forEach approach for better functional programming style

Context Used: Rule from dashboard - Prefer simpler code implementations when they achieve the same functionality, such as using `filter(... (source)

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@gilluminate
Copy link
Contributor

@jpople something seems off with this PR. It appears to include work from other recent merges? Probably a bad rebase or something.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants