@@ -17,13 +17,20 @@ import {
1717 ChevronUp ,
1818 XClose ,
1919} from '@untitledui/icons' ;
20- import { Card , Drawer , Space , Tooltip , Typography } from 'antd' ;
20+ import { Button , Card , Drawer , Space , Tooltip , Typography } from 'antd' ;
2121import { AxiosError } from 'axios' ;
22+ import { isString } from 'lodash' ;
2223import { useCallback , useEffect , useMemo , useRef , useState } from 'react' ;
2324import { useTranslation } from 'react-i18next' ;
25+ import { ReactComponent as IconEdit } from '../../../assets/svg/edit-new.svg' ;
2426import { ReactComponent as ColumnIcon } from '../../../assets/svg/ic-column-new.svg' ;
2527import { ReactComponent as KeyIcon } from '../../../assets/svg/icon-key.svg' ;
26- import { ENTITY_PATH , PAGE_SIZE_LARGE } from '../../../constants/constants' ;
28+ import {
29+ DE_ACTIVE_COLOR ,
30+ ENTITY_PATH ,
31+ ICON_DIMENSION ,
32+ PAGE_SIZE_LARGE ,
33+ } from '../../../constants/constants' ;
2734import { EntityType } from '../../../enums/entity.enum' ;
2835import { Column , TableConstraint } from '../../../generated/entity/data/table' ;
2936import { Type } from '../../../generated/entity/type' ;
@@ -60,6 +67,8 @@ import CustomPropertiesSection from '../../Explore/EntitySummaryPanel/CustomProp
6067import DataQualityTab from '../../Explore/EntitySummaryPanel/DataQualityTab/DataQualityTab' ;
6168import { LineageTabContent } from '../../Explore/EntitySummaryPanel/LineageTab' ;
6269import { LineageData } from '../../Lineage/Lineage.interface' ;
70+ import EntityNameModal from '../../Modals/EntityNameModal/EntityNameModal.component' ;
71+ import { EntityName } from '../../Modals/EntityNameModal/EntityNameModal.interface' ;
6372import {
6473 ColumnDetailPanelProps ,
6574 ColumnFieldUpdate ,
@@ -92,6 +101,7 @@ export const ColumnDetailPanel = <T extends ColumnOrTask = Column>({
92101 const { permissions } = useGenericContext ( ) ;
93102 const [ isDescriptionLoading , setIsDescriptionLoading ] = useState ( false ) ;
94103 const [ isTestCaseLoading , setIsTestCaseLoading ] = useState ( false ) ;
104+ const [ isDisplayNameEditing , setIsDisplayNameEditing ] = useState ( false ) ;
95105
96106 const hasEditPermission = useMemo (
97107 ( ) => ( {
@@ -103,6 +113,8 @@ export const ColumnDetailPanel = <T extends ColumnOrTask = Column>({
103113 viewAllPermission : permissions . ViewAll ,
104114 customProperties :
105115 ( permissions . EditCustomFields || permissions . EditAll ) && ! deleted ,
116+ displayName :
117+ ( permissions . EditDisplayName || permissions . EditAll ) && ! deleted ,
106118 } ) ,
107119 [ permissions , deleted ]
108120 ) ;
@@ -433,6 +445,36 @@ export const ColumnDetailPanel = <T extends ColumnOrTask = Column>({
433445 [ performColumnFieldUpdate , t ]
434446 ) ;
435447
448+ const handleDisplayNameUpdate = useCallback (
449+ async ( data : EntityName ) => {
450+ try {
451+ const response = await performColumnFieldUpdate (
452+ { displayName : data . displayName } ,
453+ 'label.display-name'
454+ ) ;
455+ if ( response ) {
456+ setActiveColumn (
457+ ( prev ) =>
458+ ( {
459+ ...prev ,
460+ displayName : response . displayName ,
461+ } as T )
462+ ) ;
463+ }
464+ } catch ( error ) {
465+ showErrorToast (
466+ error as AxiosError ,
467+ t ( 'server.entity-updating-error' , {
468+ entity : t ( 'label.display-name' ) ,
469+ } )
470+ ) ;
471+ } finally {
472+ setIsDisplayNameEditing ( false ) ;
473+ }
474+ } ,
475+ [ performColumnFieldUpdate , t ]
476+ ) ;
477+
436478 const previousFqnRef = useRef < string | undefined > ( ) ;
437479
438480 useEffect ( ( ) => {
@@ -675,16 +717,56 @@ export const ColumnDetailPanel = <T extends ColumnOrTask = Column>({
675717 title = { getEntityName ( activeColumn ) }
676718 trigger = "hover" >
677719 < div className = "d-flex items-center justify-between w-full" >
678- < div className = "d-flex items-center" >
679- < span className = "entity-icon" >
720+ < div className = "d-flex items-center w-full " >
721+ < span className = "entity-icon margin-right-xs " >
680722 < ColumnIcon />
681723 </ span >
682- < Typography . Text
683- className = "entity-title-link"
684- data-testid = "entity-link"
685- ellipsis = { { tooltip : true } } >
686- { stringToHTML ( getEntityName ( activeColumn ) ) }
687- </ Typography . Text >
724+ < div className = "d-flex flex-column w-full overflow-hidden" >
725+ < div className = "d-flex items-center gap-2 w-full" >
726+ < Typography . Text
727+ className = "entity-title-link"
728+ data-testid = "entity-link"
729+ ellipsis = { { tooltip : true } } >
730+ { stringToHTML (
731+ ( activeColumn as any ) . displayName || activeColumn . name
732+ ) }
733+ </ Typography . Text >
734+ { hasEditPermission . displayName &&
735+ ( entityType === EntityType . TABLE ||
736+ entityType === EntityType . DASHBOARD_DATA_MODEL ) && (
737+ < Tooltip placement = "top" title = { t ( 'label.edit' ) } >
738+ < Button
739+ ghost
740+ className = "hover-cell-icon flex-center"
741+ data-testid = "edit-displayName-button"
742+ icon = {
743+ < IconEdit
744+ color = { DE_ACTIVE_COLOR }
745+ { ...ICON_DIMENSION }
746+ />
747+ }
748+ style = { {
749+ width : '24px' ,
750+ height : '24px' ,
751+ } }
752+ type = "text"
753+ onClick = { ( ) => setIsDisplayNameEditing ( true ) }
754+ />
755+ </ Tooltip >
756+ ) }
757+ </ div >
758+ { ( activeColumn as any ) . displayName &&
759+ ( activeColumn as any ) . displayName !== activeColumn . name &&
760+ ( entityType === EntityType . TABLE ||
761+ entityType === EntityType . DASHBOARD_DATA_MODEL ) && (
762+ < Typography . Text
763+ className = "text-grey-muted text-xs"
764+ data-testid = "entity-name"
765+ ellipsis = { { tooltip : true } } >
766+ { stringToHTML ( activeColumn . name || '' ) }
767+ </ Typography . Text >
768+ ) }
769+ </ div >
688770 </ div >
689771 < div >
690772 < IconButton data-testid = "close-button" onClick = { onClose } >
@@ -835,6 +917,22 @@ export const ColumnDetailPanel = <T extends ColumnOrTask = Column>({
835917 </ div >
836918 </ div >
837919 </ div >
920+ { isDisplayNameEditing && activeColumn && (
921+ < EntityNameModal
922+ entity = { {
923+ name : isString ( activeColumn . name ) ? activeColumn . name : '' ,
924+ displayName : isString ( ( activeColumn as any ) . displayName )
925+ ? ( activeColumn as any ) . displayName
926+ : undefined ,
927+ } }
928+ title = { t ( 'label.edit-entity' , {
929+ entity : t ( 'label.display-name' ) ,
930+ } ) }
931+ visible = { isDisplayNameEditing }
932+ onCancel = { ( ) => setIsDisplayNameEditing ( false ) }
933+ onSave = { handleDisplayNameUpdate }
934+ />
935+ ) }
838936 </ Drawer >
839937 ) ;
840938} ;
0 commit comments