diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnSelect.tsx
index 32097b256ca59..dfc51cd5a8d54 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';
import { useComponentDidUpdate } from 'src/common/hooks/useComponentDidUpdate';
export const DndColumnSelect = (props: LabelProps) => {
@@ -123,9 +122,8 @@ export const DndColumnSelect = (props: LabelProps) => {
onShiftOptions={onShiftOptions}
type={`${DndItemType.ColumnOption}_${name}_${label}`}
canDelete={canDelete}
- >
-
-
+ column={column}
+ />
)),
[
canDelete,
diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndFilterSelect.tsx
index dc7e892e3fea7..6a6d88c670662 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,
@@ -299,6 +298,7 @@ export const DndFilterSelect = (props: DndFilterSelectProps) => {
() =>
values.map((adhocFilter: AdhocFilter, index: number) => {
const label = adhocFilter.getDefaultLabel();
+ const tooltipTitle = adhocFilter.getTooltipTitle();
return (
{
- {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 d624817de3c49..485919099069d 100644
--- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.tsx
+++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/OptionWrapper.tsx
@@ -28,8 +28,19 @@ 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 { ColumnMeta } from '@superset-ui/chart-controls';
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: string;
@@ -38,16 +49,19 @@ export default function OptionWrapper(
) {
const {
index,
+ label,
+ tooltipTitle,
+ column,
type,
onShiftOptions,
clickClose,
withCaret,
isExtra,
canDelete = true,
- children,
...rest
} = props;
const ref = useRef(null);
+ const labelRef = useRef(null);
const item: OptionItemInterface = useMemo(
() => ({
@@ -56,7 +70,7 @@ export default function OptionWrapper(
}),
[index, type],
);
- const [, drag] = useDrag({
+ const [{ isDragging }, drag] = useDrag({
item,
collect: (monitor: DragSourceMonitor) => ({
isDragging: monitor.isDragging(),
@@ -107,6 +121,51 @@ export default function OptionWrapper(
},
});
+ const shouldShowTooltip =
+ (!isDragging && tooltipTitle && label && tooltipTitle !== label) ||
+ (!isDragging &&
+ labelRef &&
+ labelRef.current &&
+ labelRef.current.scrollWidth > labelRef.current.clientWidth);
+
+ const LabelContent = () => {
+ if (!shouldShowTooltip) {
+ return {label};
+ }
+ return (
+
+ {label}
+
+ );
+ };
+
+ const ColumnOption = () => (
+
+ );
+
+ const Label = () => {
+ if (label) {
+ return (
+
+
+
+ );
+ }
+ if (column) {
+ return (
+
+
+
+ );
+ }
+ return null;
+ };
+
drag(drop(ref));
return (
@@ -118,7 +177,7 @@ export default function OptionWrapper(
isExtra={isExtra}
canDelete={canDelete}
>
- {children}
+
);
diff --git a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/types.ts b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/types.ts
index f11bb1d3f9e86..24cf70e06cca4 100644
--- a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/types.ts
+++ b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/types.ts
@@ -23,8 +23,11 @@ import { DatasourcePanelDndItem } from '../../DatasourcePanel/types';
import { DndItemType } from '../../DndItemType';
export interface OptionProps {
- children: ReactNode;
+ children?: ReactNode;
index: number;
+ label?: string;
+ tooltipTitle?: string;
+ column?: ColumnMeta;
clickClose: (index: number) => void;
withCaret?: boolean;
isExtra?: boolean;
diff --git a/superset-frontend/src/explore/components/controls/OptionControls/index.tsx b/superset-frontend/src/explore/components/controls/OptionControls/index.tsx
index 0469b4b916a7c..c68b3685c0121 100644
--- a/superset-frontend/src/explore/components/controls/OptionControls/index.tsx
+++ b/superset-frontend/src/explore/components/controls/OptionControls/index.tsx
@@ -45,11 +45,10 @@ export const OptionControlContainer = styled.div<{
border-radius: 3px;
cursor: ${({ withCaret }) => (withCaret ? 'pointer' : 'default')};
`;
-
export const Label = styled.div`
${({ theme }) => `
display: flex;
- max-width: 100%;
+ width: 100%;
overflow: hidden;
text-overflow: ellipsis;
align-items: center;
@@ -71,6 +70,11 @@ export const Label = styled.div`
`}
`;
+const LabelText = styled.span`
+ overflow: hidden;
+ text-overflow: ellipsis;
+`;
+
export const CaretContainer = styled.div`
height: 100%;
border-left: solid 1px ${({ theme }) => theme.colors.grayscale.dark2}0C;
@@ -195,6 +199,8 @@ export const OptionControlLabel = ({
}) => {
const theme = useTheme();
const ref = useRef(null);
+ const labelRef = useRef(null);
+ const hasMetricName = savedMetric?.metric_name;
const [, drop] = useDrop({
accept: type,
drop() {
@@ -242,7 +248,7 @@ export const OptionControlLabel = ({
item.index = hoverIndex;
},
});
- const [, drag] = useDrag({
+ const [{ isDragging }, drag] = useDrag({
item: {
type,
index,
@@ -254,10 +260,34 @@ export const OptionControlLabel = ({
});
const getLabelContent = () => {
- if (savedMetric?.metric_name) {
- return ;
+ const shouldShowTooltip =
+ (!isDragging &&
+ typeof label === 'string' &&
+ tooltipTitle &&
+ label &&
+ tooltipTitle !== label) ||
+ (!isDragging &&
+ labelRef &&
+ labelRef.current &&
+ labelRef.current.scrollWidth > labelRef.current.clientWidth);
+
+ if (savedMetric && hasMetricName) {
+ return (
+
+ );
+ }
+ if (!shouldShowTooltip) {
+ return {label};
}
- return {label};
+ return (
+
+ {label}
+
+ );
};
const getOptionControlContent = () => (
diff --git a/superset-frontend/src/explore/components/optionRenderers.tsx b/superset-frontend/src/explore/components/optionRenderers.tsx
index 74d2891df9104..fbd641db3742c 100644
--- a/superset-frontend/src/explore/components/optionRenderers.tsx
+++ b/superset-frontend/src/explore/components/optionRenderers.tsx
@@ -27,6 +27,7 @@ import {
} from '@superset-ui/chart-controls';
const OptionContainer = styled.div`
+ width: 100%;
> span {
display: flex;
align-items: center;