diff --git a/components/vc-slider/index.js b/components/vc-slider/index.js index b70004e1a..884c90092 100644 --- a/components/vc-slider/index.js +++ b/components/vc-slider/index.js @@ -1,4 +1,4 @@ -// base rc-slider 8.7.1 +// base rc-slider 9.7.2 import Slider from './src/'; export default Slider; diff --git a/components/vc-slider/src/Handle.jsx b/components/vc-slider/src/Handle.jsx deleted file mode 100644 index 5edfdf534..000000000 --- a/components/vc-slider/src/Handle.jsx +++ /dev/null @@ -1,151 +0,0 @@ -import { defineComponent } from 'vue'; -import classNames from '../../_util/classNames'; -import PropTypes from '../../_util/vue-types'; -import BaseMixin from '../../_util/BaseMixin'; -import { getOptionProps } from '../../_util/props-util'; -import addEventListener from '../../vc-util/Dom/addEventListener'; - -export default defineComponent({ - name: 'Handle', - mixins: [BaseMixin], - inheritAttrs: false, - props: { - prefixCls: PropTypes.string, - vertical: PropTypes.looseBool, - offset: PropTypes.number, - disabled: PropTypes.looseBool, - min: PropTypes.number, - max: PropTypes.number, - value: PropTypes.number, - tabindex: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), - reverse: PropTypes.looseBool, - ariaLabel: String, - ariaLabelledBy: String, - ariaValueTextFormatter: Function, - // handleFocus: PropTypes.func.def(noop), - // handleBlur: PropTypes.func.def(noop), - }, - data() { - return { - clickFocused: false, - }; - }, - mounted() { - // mouseup won't trigger if mouse moved out of handle - // so we listen on document here. - this.onMouseUpListener = addEventListener(document, 'mouseup', this.handleMouseUp); - }, - beforeUnmount() { - if (this.onMouseUpListener) { - this.onMouseUpListener.remove(); - } - }, - methods: { - setHandleRef(node) { - this.handle = node; - }, - setClickFocus(focused) { - this.setState({ clickFocused: focused }); - }, - handleMouseUp() { - if (document.activeElement === this.handle) { - this.setClickFocus(true); - } - }, - handleBlur(e) { - this.setClickFocus(false); - this.__emit('blur', e); - }, - handleKeyDown() { - this.setClickFocus(false); - }, - clickFocus() { - this.setClickFocus(true); - this.focus(); - }, - focus() { - this.handle.focus(); - }, - blur() { - this.handle.blur(); - }, - // when click can not focus in vue, use mousedown trigger focus - handleMousedown(e) { - e.preventDefault(); - this.focus(); - this.__emit('mousedown', e); - }, - }, - render() { - const { - prefixCls, - vertical, - reverse, - offset, - disabled, - min, - max, - value, - tabindex, - ariaLabel, - ariaLabelledBy, - ariaValueTextFormatter, - } = getOptionProps(this); - const className = classNames(this.$attrs.class, { - [`${prefixCls}-handle-click-focused`]: this.clickFocused, - }); - - const positionStyle = vertical - ? { - [reverse ? 'top' : 'bottom']: `${offset}%`, - [reverse ? 'bottom' : 'top']: 'auto', - transform: reverse ? null : `translateY(+50%)`, - } - : { - [reverse ? 'right' : 'left']: `${offset}%`, - [reverse ? 'left' : 'right']: 'auto', - transform: `translateX(${reverse ? '+' : '-'}50%)`, - }; - - const ariaProps = { - 'aria-valuemin': min, - 'aria-valuemax': max, - 'aria-valuenow': value, - 'aria-disabled': !!disabled, - }; - const elStyle = { - ...this.$attrs.style, - ...positionStyle, - }; - let mergedTabIndex = tabindex || 0; - if (disabled || tabindex === null) { - mergedTabIndex = null; - } - - let ariaValueText; - if (ariaValueTextFormatter) { - ariaValueText = ariaValueTextFormatter(value); - } - - const handleProps = { - ...this.$attrs, - role: 'slider', - tabindex: mergedTabIndex, - ...ariaProps, - class: className, - onBlur: this.handleBlur, - onKeydown: this.handleKeyDown, - onMousedown: this.handleMousedown, - ref: this.setHandleRef, - style: elStyle, - }; - return ( -
- ); - }, -}); diff --git a/components/vc-slider/src/Handle.tsx b/components/vc-slider/src/Handle.tsx new file mode 100644 index 000000000..efdf37fd0 --- /dev/null +++ b/components/vc-slider/src/Handle.tsx @@ -0,0 +1,265 @@ +import { computed, CSSProperties, defineComponent, ref } from 'vue'; +import classNames from '../../_util/classNames'; +import PropTypes from '../../_util/vue-types'; +import addEventListener from '../../vc-util/Dom/addEventListener'; +import { onMounted } from 'vue'; +import { onBeforeUnmount } from 'vue'; + +export default defineComponent({ + name: 'Handle', + inheritAttrs: false, + props: { + prefixCls: PropTypes.string, + vertical: PropTypes.looseBool, + offset: PropTypes.number, + disabled: PropTypes.looseBool, + min: PropTypes.number, + max: PropTypes.number, + value: PropTypes.number, + tabindex: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), + reverse: PropTypes.looseBool, + ariaLabel: String, + ariaLabelledBy: String, + ariaValueTextFormatter: Function, + }, + setup(props, { attrs, emit, expose }) { + const clickFocused = ref(false); + const handle = ref(); + const handleMouseUp = () => { + if (document.activeElement === handle.value) { + clickFocused.value = true; + } + }; + const handleBlur = () => { + clickFocused.value = false; + emit('blur'); + }; + const handleKeyDown = () => { + clickFocused.value = false; + }; + const focus = () => { + handle.value?.focus(); + }; + const blur = () => { + handle.value?.blur(); + }; + const clickFocus = () => { + clickFocused.value = true; + focus(); + }; + + // when click can not focus in vue, use mousedown trigger focus + const handleMousedown = (e: MouseEvent) => { + e.preventDefault(); + focus(); + emit('mousedown', e); + }; + expose({ + focus, + blur, + clickFocus, + }); + let onMouseUpListener = null; + onMounted(() => { + onMouseUpListener = addEventListener(document, 'mouseup', handleMouseUp); + }); + onBeforeUnmount(() => { + onMouseUpListener?.remove(); + }); + + const positionStyle = computed(() => { + const { vertical, offset, reverse } = props; + return vertical + ? { + [reverse ? 'top' : 'bottom']: `${offset}%`, + [reverse ? 'bottom' : 'top']: 'auto', + transform: reverse ? null : `translateY(+50%)`, + } + : { + [reverse ? 'right' : 'left']: `${offset}%`, + [reverse ? 'left' : 'right']: 'auto', + transform: `translateX(${reverse ? '+' : '-'}50%)`, + }; + }); + return () => { + const { + prefixCls, + disabled, + min, + max, + value, + tabindex, + ariaLabel, + ariaLabelledBy, + ariaValueTextFormatter, + } = props; + const className = classNames(attrs.class, { + [`${prefixCls}-handle-click-focused`]: clickFocused.value, + }); + + const ariaProps = { + 'aria-valuemin': min, + 'aria-valuemax': max, + 'aria-valuenow': value, + 'aria-disabled': !!disabled, + }; + const elStyle = { + ...(attrs.style as CSSProperties), + ...positionStyle.value, + }; + let mergedTabIndex = tabindex || 0; + if (disabled || tabindex === null) { + mergedTabIndex = null; + } + + let ariaValueText; + if (ariaValueTextFormatter) { + ariaValueText = ariaValueTextFormatter(value); + } + + const handleProps = { + ...attrs, + role: 'slider', + tabindex: mergedTabIndex, + ...ariaProps, + class: className, + onBlur: handleBlur, + onKeydown: handleKeyDown, + onMousedown: handleMousedown, + ref: handle, + style: elStyle, + }; + return ( + + ); + }; + }, + // data() { + // return { + // clickFocused: false, + // }; + // }, + // mounted() { + // // mouseup won't trigger if mouse moved out of handle + // // so we listen on document here. + // this.onMouseUpListener = addEventListener(document, 'mouseup', this.handleMouseUp); + // }, + // beforeUnmount() { + // if (this.onMouseUpListener) { + // this.onMouseUpListener.remove(); + // } + // }, + // methods: { + // setHandleRef(node) { + // this.handle = node; + // }, + // setClickFocus(focused) { + // this.setState({ clickFocused: focused }); + // }, + // handleMouseUp() { + // if (document.activeElement === this.handle) { + // this.setClickFocus(true); + // } + // }, + // handleBlur(e) { + // this.setClickFocus(false); + // this.__emit('blur', e); + // }, + // handleKeyDown() { + // this.setClickFocus(false); + // }, + // clickFocus() { + // this.setClickFocus(true); + // this.focus(); + // }, + // focus() { + // this.handle.focus(); + // }, + // blur() { + // this.handle.blur(); + // }, + // // when click can not focus in vue, use mousedown trigger focus + // handleMousedown(e) { + // e.preventDefault(); + // this.focus(); + // this.__emit('mousedown', e); + // }, + // }, + // render() { + // const { + // prefixCls, + // vertical, + // reverse, + // offset, + // disabled, + // min, + // max, + // value, + // tabindex, + // ariaLabel, + // ariaLabelledBy, + // ariaValueTextFormatter, + // } = getOptionProps(this); + // const className = classNames(this.$attrs.class, { + // [`${prefixCls}-handle-click-focused`]: this.clickFocused, + // }); + + // const positionStyle = vertical + // ? { + // [reverse ? 'top' : 'bottom']: `${offset}%`, + // [reverse ? 'bottom' : 'top']: 'auto', + // transform: reverse ? null : `translateY(+50%)`, + // } + // : { + // [reverse ? 'right' : 'left']: `${offset}%`, + // [reverse ? 'left' : 'right']: 'auto', + // transform: `translateX(${reverse ? '+' : '-'}50%)`, + // }; + + // const ariaProps = { + // 'aria-valuemin': min, + // 'aria-valuemax': max, + // 'aria-valuenow': value, + // 'aria-disabled': !!disabled, + // }; + // const elStyle = { + // ...this.$attrs.style, + // ...positionStyle, + // }; + // let mergedTabIndex = tabindex || 0; + // if (disabled || tabindex === null) { + // mergedTabIndex = null; + // } + + // let ariaValueText; + // if (ariaValueTextFormatter) { + // ariaValueText = ariaValueTextFormatter(value); + // } + + // const handleProps = { + // ...this.$attrs, + // role: 'slider', + // tabindex: mergedTabIndex, + // ...ariaProps, + // class: className, + // onBlur: this.handleBlur, + // onKeydown: this.handleKeyDown, + // onMousedown: this.handleMousedown, + // ref: this.setHandleRef, + // style: elStyle, + // }; + // return ( + // + // ); + // }, +}); diff --git a/components/vc-slider/src/Range.jsx b/components/vc-slider/src/Range.tsx similarity index 100% rename from components/vc-slider/src/Range.jsx rename to components/vc-slider/src/Range.tsx diff --git a/components/vc-slider/src/Slider.jsx b/components/vc-slider/src/Slider.tsx similarity index 100% rename from components/vc-slider/src/Slider.jsx rename to components/vc-slider/src/Slider.tsx diff --git a/components/vc-slider/src/common/Marks.jsx b/components/vc-slider/src/common/Marks.tsx similarity index 97% rename from components/vc-slider/src/common/Marks.jsx rename to components/vc-slider/src/common/Marks.tsx index ea5f3ee25..286b3c323 100644 --- a/components/vc-slider/src/common/Marks.jsx +++ b/components/vc-slider/src/common/Marks.tsx @@ -2,7 +2,7 @@ import supportsPassive from '../../../_util/supportsPassive'; import classNames from '../../../_util/classNames'; import { isValidElement } from '../../../_util/props-util'; -const Marks = (_, { attrs, slots }) => { +const Marks = (_: any, { attrs, slots }: any) => { const { class: className, vertical, diff --git a/components/vc-slider/src/common/Steps.jsx b/components/vc-slider/src/common/Steps.tsx similarity index 83% rename from components/vc-slider/src/common/Steps.jsx rename to components/vc-slider/src/common/Steps.tsx index c34be3990..289d8141c 100644 --- a/components/vc-slider/src/common/Steps.jsx +++ b/components/vc-slider/src/common/Steps.tsx @@ -1,7 +1,16 @@ +import { CSSProperties } from 'vue'; import classNames from '../../../_util/classNames'; +import { VueNode } from '../../../_util/type'; import warning from '../../../_util/warning'; -const calcPoints = (vertical, marks, dots, step, min, max) => { +const calcPoints = ( + _vertical: boolean, + marks: Record