-
Notifications
You must be signed in to change notification settings - Fork 1.6k
feat(ui): implement column detail view #24268
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
Hi there 👋 Thanks for your contribution! The OpenMetadata team will review the PR shortly! Once it has been labeled as Let us know if you need any help! |
|
Hi there 👋 Thanks for your contribution! The OpenMetadata team will review the PR shortly! Once it has been labeled as Let us know if you need any help! |
|
Hi there 👋 Thanks for your contribution! The OpenMetadata team will review the PR shortly! Once it has been labeled as Let us know if you need any help! |
|
Hi there 👋 Thanks for your contribution! The OpenMetadata team will review the PR shortly! Once it has been labeled as Let us know if you need any help! |
|
Hi there 👋 Thanks for your contribution! The OpenMetadata team will review the PR shortly! Once it has been labeled as Let us know if you need any help! |
|
Hi there 👋 Thanks for your contribution! The OpenMetadata team will review the PR shortly! Once it has been labeled as Let us know if you need any help! |
|
Hi there 👋 Thanks for your contribution! The OpenMetadata team will review the PR shortly! Once it has been labeled as Let us know if you need any help! |
|
Hi there 👋 Thanks for your contribution! The OpenMetadata team will review the PR shortly! Once it has been labeled as Let us know if you need any help! |
… Provider (#25074) * refactor: Simplify ColumnDetailPanel props and integrate with GenericProvider This refactoring improves code maintainability and reduces duplication across 8 components that use ColumnDetailPanel by introducing simplified props pattern and optional GenericProvider integration. Key Improvements: 1. Simplified Props Pattern - Added 'permissions' and 'deleted' props to automatically compute edit/view permissions - Maintains backward compatibility with existing hasEditPermission/hasViewPermission props - Reduces boilerplate code in all consuming components 2. Permission Auto-computation - ColumnDetailPanel now derives edit permissions from OperationPermission when 'permissions' prop is provided - Automatically handles 'deleted' state to disable editing on deleted entities - Consolidates permission logic in one place 3. GenericProvider Integration - Added optional columnDetailPanelConfig to GenericProvider for centralized state management - Provides openColumnDetailPanel and closeColumnDetailPanel methods via context - Allows components to optionally use centralized ColumnDetailPanel rendering 4. Codebase-wide Updates Updated all 8 files using ColumnDetailPanel to use the new simplified pattern: - SchemaTable.component.tsx - TopicSchema.tsx - APIEndpointSchema.tsx - ContainerDataModel.tsx - ModelTab.component.tsx - MlModelFeaturesList.tsx - PipelineTaskTab.tsx - SearchIndexFieldsTable.tsx 5. Bug Fixes - Fixed TagsSection popover placement from 'topRight' to 'top' - Removed unused viewCustomPropertiesPermission variable in ModelTab Benefits: - Reduced code duplication across 8+ components - More maintainable and consistent permission handling - Easier to add new permission types in the future - Cleaner component props with fewer required parameters - Backward compatible - existing code continues to work Testing: - All ColumnDetailPanel tests pass (10/10) - No TypeScript errors introduced - ESLint warnings resolved 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <[email protected]> * add generic provider support for mlmodel, pipeline, topic * replace columndetailPanel component with generic provider for pending types * remove unnecessary props & fix failing test * minor fixes * fix test * remove unwanted code * major code refactoring * fix failing tests * major code refactoring improvements * nit * improve types * remove unwanted logic * address comments * refactor --------- Co-authored-by: Claude Sonnet 4.5 <[email protected]>
| if (isColumnDetailPanel && testCases.length > 0) { | ||
| const allPromises = testCases.map((testCase) => | ||
| getListTestCaseIncidentStatus({ | ||
| latest: true, | ||
| include: Include.NonDeleted, | ||
| testCaseFQN: testCase.fullyQualifiedName, | ||
| startTs, | ||
| endTs, | ||
| limit: 50, | ||
| }).catch(() => ({ data: [] })) | ||
| ); | ||
|
|
||
| const results = await Promise.all(allPromises); | ||
| allIncidents = results.flatMap((result) => result.data || []); | ||
| } else { | ||
| // For table/entity level, use originEntityFQN | ||
| const response = await getListTestCaseIncidentStatus({ | ||
| latest: true, | ||
| include: Include.NonDeleted, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Details
In DataQualityTab.tsx, when isColumnDetailPanel is true, the code makes separate API calls for each test case to fetch incidents. This results in N API calls where N is the number of test cases, which can be slow for columns with many tests.
if (isColumnDetailPanel && testCases.length > 0) {
const allPromises = testCases.map((testCase) =>
getListTestCaseIncidentStatus({
latest: true,
include: Include.NonDeleted,
testCaseFQN: testCase.fullyQualifiedName,
...
}).catch(() => ({ data: [] }))
);
const results = await Promise.all(allPromises);
allIncidents = results.flatMap((result) => result.data || []);
}Impact: For a column with 20 test cases, this will make 20 API calls in parallel, which may:
- Create significant load on the backend
- Slow down the panel opening experience
- Risk rate limiting
Suggestion: Consider batching these requests or implementing a backend endpoint that accepts multiple test case FQNs in a single call. Alternatively, add pagination/limiting to the number of concurrent requests.
| const response = await getTableColumnsByFQN(tableFqn, { | ||
| fields: TabSpecificField.PROFILE, | ||
| limit: 1000, | ||
| }); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Performance: API fetches all 1000 columns to get profile for single column
Details
In KeyProfileMetrics.component.tsx, the code fetches all columns (with limit 1000) just to find the profile for a single column:
const response = await getTableColumnsByFQN(tableFqn, {
fields: TabSpecificField.PROFILE,
limit: 1000,
});
const columnData = response.data?.find(
(col) => col.fullyQualifiedName === columnFqn
);Impact: This fetches potentially thousands of column profiles when only one is needed. For tables with many columns, this is wasteful in terms of bandwidth and processing.
Suggestion: If the API supports it, filter by the specific column FQN on the backend. Alternatively, consider caching the profile data at the table level to avoid repeated fetches as users navigate between columns.
Code Review 👍 Approved with suggestionsWell-structured implementation of column detail view with comprehensive testing, but two performance issues from the previous review remain unaddressed.
|
| Auto-apply | Compact |
|
|
This comment will update automatically (Docs)
|



Describe your changes:
Fixes #25083
I worked on ... because ...
Screen.Recording.2025-12-11.at.5.06.36.PM.mov
Type of change:
Checklist:
Fixes <issue-number>: <short explanation>Summary by Gitar
ColumnDetailPanel(678 lines) displays column metadata in side drawer with tabs for Overview, Data Quality, Lineage, and Custom PropertiesflattenColumns,buildColumnBreadcrumbPath,mergeTagsWithGlossaryinTableUtilshandle nested columns and tag/glossary preservationKeyProfileMetricsdisplays profile metrics (Uniqueness, Nullness, Distinct, Value Count);NestedColumnsSectionenables nested column navigationThis will update automatically on new commits.