diff --git a/app/client/packages/design-system/ads/src/List/List.tsx b/app/client/packages/design-system/ads/src/List/List.tsx index f066d484ef..7ae36989c2 100644 --- a/app/client/packages/design-system/ads/src/List/List.tsx +++ b/app/client/packages/design-system/ads/src/List/List.tsx @@ -119,7 +119,7 @@ function ListItem(props: ListItemProps) { return ( { + return element && element.clientWidth < element.scrollWidth; +}; export const EditableEntityName = (props: EditableEntityNameProps) => { const { @@ -16,13 +22,17 @@ export const EditableEntityName = (props: EditableEntityNameProps) => { isFixedWidth, isLoading, name, + normalizeName = false, onExitEditing, onNameSave, + showEllipsis = false, size = "small", validateName, } = props; const inEditMode = canEdit ? isEditing : false; + const [showTooltip, setShowTooltip] = useState(false); + const longNameRef = useRef(null); const [ inputRef, @@ -36,6 +46,7 @@ export const EditableEntityName = (props: EditableEntityNameProps) => { onExitEditing, validateName, onNameSave, + normalizeName, ); // When in loading state, start icon becomes the loading icon @@ -58,30 +69,54 @@ export const EditableEntityName = (props: EditableEntityNameProps) => { paddingTop: "4px", paddingBottom: "4px", top: "-5px", + placeholder: "Name", }, }), [handleKeyUp, handleTitleChange, inputTestId], ); + useEffect( + function handleShowTooltipOnEllipsis() { + if (showEllipsis) { + setShowTooltip(!!isEllipsisActive(longNameRef.current)); + } + }, + [editableName, showEllipsis], + ); + return ( {startIcon} - - {editableName} - + + {editableName} + + ); diff --git a/app/client/packages/design-system/ads/src/Templates/EditableEntityName/EditableEntityName.types.ts b/app/client/packages/design-system/ads/src/Templates/EditableEntityName/EditableEntityName.types.ts index e51d4350ff..3531ce8c47 100644 --- a/app/client/packages/design-system/ads/src/Templates/EditableEntityName/EditableEntityName.types.ts +++ b/app/client/packages/design-system/ads/src/Templates/EditableEntityName/EditableEntityName.types.ts @@ -23,4 +23,8 @@ export interface EditableEntityNameProps { onNameSave: (name: string) => void; /** Function to validate the name. */ validateName: (name: string) => string | null; + /** Whether a name should be normalized on renaming */ + normalizeName?: boolean; + /** Used for showing ellipsis for longer names */ + showEllipsis?: boolean; } diff --git a/app/client/packages/design-system/ads/src/Templates/EntityContextMenu/EntityContextMenu.tsx b/app/client/packages/design-system/ads/src/Templates/EntityContextMenu/EntityContextMenu.tsx index 70cb3e8a93..5d8abdcb23 100644 --- a/app/client/packages/design-system/ads/src/Templates/EntityContextMenu/EntityContextMenu.tsx +++ b/app/client/packages/design-system/ads/src/Templates/EntityContextMenu/EntityContextMenu.tsx @@ -14,7 +14,7 @@ import { import * as Styled from "./EntityContextMenu.styles"; interface Props { - dataTestid?: string; + dataTestId?: string; children?: React.ReactNode[] | React.ReactNode; tooltipContent?: React.ReactNode; } @@ -22,7 +22,7 @@ interface Props { export const EntityContextMenu = (props: Props) => { const { children, - dataTestid = DEFAULT_DATA_TEST_ID, + dataTestId = DEFAULT_DATA_TEST_ID, tooltipContent = DEFAULT_TOOLTIP_CONTENT, } = props; @@ -40,7 +40,7 @@ export const EntityContextMenu = (props: Props) => { >