From e282ae30f2a40bde8ed2ee6c75307bce660a2335 Mon Sep 17 00:00:00 2001 From: geido Date: Mon, 2 Aug 2021 19:12:38 +0200 Subject: [PATCH 01/11] Implement dynamic tooltip --- .../DndColumnSelect.tsx | 6 +- .../DndFilterSelect.tsx | 6 +- .../OptionWrapper.test.tsx | 15 ++--- .../DndColumnSelectControl/OptionWrapper.tsx | 63 ++++++++++++++++++- .../controls/DndColumnSelectControl/types.ts | 4 +- .../controls/OptionControls/index.tsx | 36 ++++++++--- 6 files changed, 102 insertions(+), 28 deletions(-) diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx index d677aa2104d8a..9ac7d045ac643 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx @@ -26,7 +26,6 @@ import OptionWrapper from 'src/explore/components/controls/DndColumnSelectContro import { OptionSelector } from 'src/explore/components/controls/DndColumnSelectControl/utils'; import { DatasourcePanelDndItem } from 'src/explore/components/DatasourcePanel/types'; import { DndItemType } from 'src/explore/components/DndItemType'; -import { StyledColumnOption } from 'src/explore/components/optionRenderers'; export const DndColumnSelect = (props: LabelProps) => { const { @@ -99,9 +98,8 @@ export const DndColumnSelect = (props: LabelProps) => { onShiftOptions={onShiftOptions} type={DndItemType.ColumnOption} canDelete={canDelete} - > - - + column={column} + /> )); return ( diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx index f0b7c1d44d1a8..ab44875e96e53 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx @@ -26,7 +26,6 @@ import { t, } from '@superset-ui/core'; import { ColumnMeta } from '@superset-ui/chart-controls'; -import { Tooltip } from 'src/components/Tooltip'; import { OPERATOR_ENUM_TO_OPERATOR_TYPE, Operators, @@ -284,14 +283,13 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => { - {label} - + /> ); }); diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.test.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.test.tsx index c46f49be0107e..e237cea989a5c 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.test.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.test.tsx @@ -28,9 +28,8 @@ test('renders with default props', () => { clickClose={jest.fn()} type={'Column' as DndItemType} onShiftOptions={jest.fn()} - > - Option - , + label="Option" + />, { useDnd: true }, ); expect(container).toBeInTheDocument(); @@ -46,17 +45,15 @@ test('triggers onShiftOptions on drop', () => { clickClose={jest.fn()} type={'Column' as DndItemType} onShiftOptions={onShiftOptions} - > - Option 1 - + label="Option 1" + /> - Option 2 - + label="Option 2" + /> , { useDnd: true }, ); diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.tsx index 62230c56f87b1..9ed846dd4e0af 100644 --- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.tsx +++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.tsx @@ -29,8 +29,18 @@ import { OptionProps, OptionItemInterface, } from 'src/explore/components/controls/DndColumnSelectControl/types'; +import { Tooltip } from 'src/components/Tooltip'; +import { StyledColumnOption } from 'src/explore/components/optionRenderers'; +import { styled } from '@superset-ui/core'; import Option from './Option'; +export const OptionLabel = styled.div` + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +`; + export default function OptionWrapper( props: OptionProps & { type: DndItemType; @@ -39,22 +49,24 @@ export default function OptionWrapper( ) { const { index, + label, + column, type, onShiftOptions, clickClose, withCaret, isExtra, canDelete = true, - children, ...rest } = props; const ref = useRef(null); + const labelRef = useRef(null); const item: OptionItemInterface = { dragIndex: index, type, }; - const [, drag] = useDrag({ + const [{ isDragging }, drag] = useDrag({ item, collect: (monitor: DragSourceMonitor) => ({ isDragging: monitor.isDragging(), @@ -105,6 +117,49 @@ export default function OptionWrapper( }, }); + const shouldShowTooltip = () => { + if (labelRef && labelRef.current) { + return labelRef.current.scrollWidth > labelRef.current.clientWidth; + } + return false; + }; + + const Label = () => { + if (label) { + const showTooltip = !isDragging && shouldShowTooltip(); + if (!showTooltip) { + return <>{label}; + } + return {label}; + } + return null; + }; + + const ColumnOption = () => { + if (column) { + const showTooltip = !isDragging && shouldShowTooltip(); + return ( + + ); + } + return null; + }; + + const LabelContent = () => { + if (label) { + return