import PropTypes from '../../_util/vue-types';
import BaseMixin from '../../_util/BaseMixin';
import Tooltip from '../../vc-tooltip';
import { getOptionProps } from '../../_util/props-util';
import Handle from './Handle';
export default function createSliderWithTooltip(Component) {
return {
name: 'SliderTooltip',
inheritAttrs: false,
mixins: [BaseMixin, Component],
props: {
...Component.props,
tipFormatter: PropTypes.func.def(value => {
return value;
}),
handleStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.arrayOf(PropTypes.object)]),
tipProps: PropTypes.object.def(() => ({})),
},
data() {
return {
visibles: {},
};
},
methods: {
handleTooltipVisibleChange(index, visible) {
this.setState(prevState => {
return {
visibles: {
...prevState.visibles,
[index]: visible,
},
};
});
},
handleWithTooltip({ value, dragging, index, disabled, ...restProps }) {
const { tipFormatter, tipProps, handleStyle } = this.$props;
const {
prefixCls = 'rc-slider-tooltip',
overlay = tipFormatter(value),
placement = 'top',
visible = false,
...restTooltipProps
} = tipProps;
let handleStyleWithIndex;
if (Array.isArray(handleStyle)) {
handleStyleWithIndex = handleStyle[index] || handleStyle[0];
} else {
handleStyleWithIndex = handleStyle;
}
const tooltipProps = {
...restTooltipProps,
prefixCls,
overlay,
placement,
visible: (!disabled && (this.visibles[index] || dragging)) || visible,
key: index,
};
const handleProps = {
value,
...restProps,
onMouseenter: () => this.handleTooltipVisibleChange(index, true),
onMouseleave: () => this.handleTooltipVisibleChange(index, false),
style: handleStyleWithIndex,
};
return (
);
},
},
render() {
const componentProps = {
...getOptionProps(this),
handle: this.handleWithTooltip,
};
return ;
},
};
}