UNPKG

18.7 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4var _typeof3 = require("@babel/runtime/helpers/typeof");
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = void 0;
9var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
10var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
12var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
14var _classnames = _interopRequireDefault(require("classnames"));
15var _useMergedState3 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
16var _isEqual = _interopRequireDefault(require("rc-util/lib/isEqual"));
17var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
18var React = _interopRequireWildcard(require("react"));
19var _Handles = _interopRequireDefault(require("./Handles"));
20var _Marks = _interopRequireDefault(require("./Marks"));
21var _Steps = _interopRequireDefault(require("./Steps"));
22var _Tracks = _interopRequireDefault(require("./Tracks"));
23var _context = _interopRequireDefault(require("./context"));
24var _useDrag3 = _interopRequireDefault(require("./hooks/useDrag"));
25var _useOffset3 = _interopRequireDefault(require("./hooks/useOffset"));
26function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
27function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
28/**
29 * New:
30 * - click mark to update range value
31 * - handleRender
32 * - Fix handle with count not correct
33 * - Fix pushable not work in some case
34 * - No more FindDOMNode
35 * - Move all position related style into inline style
36 * - Key: up is plus, down is minus
37 * - fix Key with step = null not align with marks
38 * - Change range should not trigger onChange
39 * - keyboard support pushable
40 */
41
42var Slider = /*#__PURE__*/React.forwardRef(function (props, ref) {
43 var _props$prefixCls = props.prefixCls,
44 prefixCls = _props$prefixCls === void 0 ? 'rc-slider' : _props$prefixCls,
45 className = props.className,
46 style = props.style,
47 classNames = props.classNames,
48 styles = props.styles,
49 _props$disabled = props.disabled,
50 disabled = _props$disabled === void 0 ? false : _props$disabled,
51 _props$keyboard = props.keyboard,
52 keyboard = _props$keyboard === void 0 ? true : _props$keyboard,
53 autoFocus = props.autoFocus,
54 onFocus = props.onFocus,
55 onBlur = props.onBlur,
56 _props$min = props.min,
57 min = _props$min === void 0 ? 0 : _props$min,
58 _props$max = props.max,
59 max = _props$max === void 0 ? 100 : _props$max,
60 _props$step = props.step,
61 step = _props$step === void 0 ? 1 : _props$step,
62 value = props.value,
63 defaultValue = props.defaultValue,
64 range = props.range,
65 count = props.count,
66 onChange = props.onChange,
67 onBeforeChange = props.onBeforeChange,
68 onAfterChange = props.onAfterChange,
69 onChangeComplete = props.onChangeComplete,
70 _props$allowCross = props.allowCross,
71 allowCross = _props$allowCross === void 0 ? true : _props$allowCross,
72 _props$pushable = props.pushable,
73 pushable = _props$pushable === void 0 ? false : _props$pushable,
74 draggableTrack = props.draggableTrack,
75 reverse = props.reverse,
76 vertical = props.vertical,
77 _props$included = props.included,
78 included = _props$included === void 0 ? true : _props$included,
79 startPoint = props.startPoint,
80 trackStyle = props.trackStyle,
81 handleStyle = props.handleStyle,
82 railStyle = props.railStyle,
83 dotStyle = props.dotStyle,
84 activeDotStyle = props.activeDotStyle,
85 marks = props.marks,
86 dots = props.dots,
87 handleRender = props.handleRender,
88 activeHandleRender = props.activeHandleRender,
89 _props$tabIndex = props.tabIndex,
90 tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,
91 ariaLabelForHandle = props.ariaLabelForHandle,
92 ariaLabelledByForHandle = props.ariaLabelledByForHandle,
93 ariaValueTextFormatterForHandle = props.ariaValueTextFormatterForHandle;
94 var handlesRef = React.useRef(null);
95 var containerRef = React.useRef(null);
96 var direction = React.useMemo(function () {
97 if (vertical) {
98 return reverse ? 'ttb' : 'btt';
99 }
100 return reverse ? 'rtl' : 'ltr';
101 }, [reverse, vertical]);
102
103 // ============================ Range =============================
104 var mergedMin = React.useMemo(function () {
105 return isFinite(min) ? min : 0;
106 }, [min]);
107 var mergedMax = React.useMemo(function () {
108 return isFinite(max) ? max : 100;
109 }, [max]);
110
111 // ============================= Step =============================
112 var mergedStep = React.useMemo(function () {
113 return step !== null && step <= 0 ? 1 : step;
114 }, [step]);
115
116 // ============================= Push =============================
117 var mergedPush = React.useMemo(function () {
118 if (typeof pushable === 'boolean') {
119 return pushable ? mergedStep : false;
120 }
121 return pushable >= 0 ? pushable : false;
122 }, [pushable, mergedStep]);
123
124 // ============================ Marks =============================
125 var markList = React.useMemo(function () {
126 return Object.keys(marks || {}).map(function (key) {
127 var mark = marks[key];
128 var markObj = {
129 value: Number(key)
130 };
131 if (mark && (0, _typeof2.default)(mark) === 'object' && ! /*#__PURE__*/React.isValidElement(mark) && ('label' in mark || 'style' in mark)) {
132 markObj.style = mark.style;
133 markObj.label = mark.label;
134 } else {
135 markObj.label = mark;
136 }
137 return markObj;
138 }).filter(function (_ref) {
139 var label = _ref.label;
140 return label || typeof label === 'number';
141 }).sort(function (a, b) {
142 return a.value - b.value;
143 });
144 }, [marks]);
145
146 // ============================ Format ============================
147 var _useOffset = (0, _useOffset3.default)(mergedMin, mergedMax, mergedStep, markList, allowCross, mergedPush),
148 _useOffset2 = (0, _slicedToArray2.default)(_useOffset, 2),
149 formatValue = _useOffset2[0],
150 offsetValues = _useOffset2[1];
151
152 // ============================ Values ============================
153 var _useMergedState = (0, _useMergedState3.default)(defaultValue, {
154 value: value
155 }),
156 _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
157 mergedValue = _useMergedState2[0],
158 setValue = _useMergedState2[1];
159 var rawValues = React.useMemo(function () {
160 var valueList = mergedValue === null || mergedValue === undefined ? [] : Array.isArray(mergedValue) ? mergedValue : [mergedValue];
161 var _valueList = (0, _slicedToArray2.default)(valueList, 1),
162 _valueList$ = _valueList[0],
163 val0 = _valueList$ === void 0 ? mergedMin : _valueList$;
164 var returnValues = mergedValue === null ? [] : [val0];
165
166 // Format as range
167 if (range) {
168 returnValues = (0, _toConsumableArray2.default)(valueList);
169
170 // When count provided or value is `undefined`, we fill values
171 if (count || mergedValue === undefined) {
172 var pointCount = count >= 0 ? count + 1 : 2;
173 returnValues = returnValues.slice(0, pointCount);
174
175 // Fill with count
176 while (returnValues.length < pointCount) {
177 var _returnValues;
178 returnValues.push((_returnValues = returnValues[returnValues.length - 1]) !== null && _returnValues !== void 0 ? _returnValues : mergedMin);
179 }
180 }
181 returnValues.sort(function (a, b) {
182 return a - b;
183 });
184 }
185
186 // Align in range
187 returnValues.forEach(function (val, index) {
188 returnValues[index] = formatValue(val);
189 });
190 return returnValues;
191 }, [mergedValue, range, mergedMin, count, formatValue]);
192
193 // =========================== onChange ===========================
194 var rawValuesRef = React.useRef(rawValues);
195 rawValuesRef.current = rawValues;
196 var getTriggerValue = function getTriggerValue(triggerValues) {
197 return range ? triggerValues : triggerValues[0];
198 };
199 var triggerChange = function triggerChange(nextValues) {
200 // Order first
201 var cloneNextValues = (0, _toConsumableArray2.default)(nextValues).sort(function (a, b) {
202 return a - b;
203 });
204
205 // Trigger event if needed
206 if (onChange && !(0, _isEqual.default)(cloneNextValues, rawValuesRef.current, true)) {
207 onChange(getTriggerValue(cloneNextValues));
208 }
209
210 // We set this later since it will re-render component immediately
211 setValue(cloneNextValues);
212 };
213 var finishChange = function finishChange() {
214 var finishValue = getTriggerValue(rawValuesRef.current);
215 onAfterChange === null || onAfterChange === void 0 || onAfterChange(finishValue);
216 (0, _warning.default)(!onAfterChange, '[rc-slider] `onAfterChange` is deprecated. Please use `onChangeComplete` instead.');
217 onChangeComplete === null || onChangeComplete === void 0 || onChangeComplete(finishValue);
218 };
219 var _useDrag = (0, _useDrag3.default)(containerRef, direction, rawValues, mergedMin, mergedMax, formatValue, triggerChange, finishChange, offsetValues),
220 _useDrag2 = (0, _slicedToArray2.default)(_useDrag, 4),
221 draggingIndex = _useDrag2[0],
222 draggingValue = _useDrag2[1],
223 cacheValues = _useDrag2[2],
224 onStartDrag = _useDrag2[3];
225 var changeToCloseValue = function changeToCloseValue(newValue, e) {
226 if (!disabled) {
227 var valueIndex = 0;
228 var valueDist = mergedMax - mergedMin;
229 rawValues.forEach(function (val, index) {
230 var dist = Math.abs(newValue - val);
231 if (dist <= valueDist) {
232 valueDist = dist;
233 valueIndex = index;
234 }
235 });
236
237 // Create new values
238 var cloneNextValues = (0, _toConsumableArray2.default)(rawValues);
239 cloneNextValues[valueIndex] = newValue;
240
241 // Fill value to match default 2
242 if (range && !rawValues.length && count === undefined) {
243 cloneNextValues.push(newValue);
244 }
245 onBeforeChange === null || onBeforeChange === void 0 || onBeforeChange(getTriggerValue(cloneNextValues));
246 triggerChange(cloneNextValues);
247 if (e) {
248 var _document$activeEleme, _document$activeEleme2;
249 (_document$activeEleme = document.activeElement) === null || _document$activeEleme === void 0 || (_document$activeEleme2 = _document$activeEleme.blur) === null || _document$activeEleme2 === void 0 || _document$activeEleme2.call(_document$activeEleme);
250 handlesRef.current.focus(valueIndex);
251 onStartDrag(e, valueIndex, cloneNextValues);
252 }
253 }
254 };
255
256 // ============================ Click =============================
257 var onSliderMouseDown = function onSliderMouseDown(e) {
258 e.preventDefault();
259 var _containerRef$current = containerRef.current.getBoundingClientRect(),
260 width = _containerRef$current.width,
261 height = _containerRef$current.height,
262 left = _containerRef$current.left,
263 top = _containerRef$current.top,
264 bottom = _containerRef$current.bottom,
265 right = _containerRef$current.right;
266 var clientX = e.clientX,
267 clientY = e.clientY;
268 var percent;
269 switch (direction) {
270 case 'btt':
271 percent = (bottom - clientY) / height;
272 break;
273 case 'ttb':
274 percent = (clientY - top) / height;
275 break;
276 case 'rtl':
277 percent = (right - clientX) / width;
278 break;
279 default:
280 percent = (clientX - left) / width;
281 }
282 var nextValue = mergedMin + percent * (mergedMax - mergedMin);
283 changeToCloseValue(formatValue(nextValue), e);
284 };
285
286 // =========================== Keyboard ===========================
287 var _React$useState = React.useState(null),
288 _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
289 keyboardValue = _React$useState2[0],
290 setKeyboardValue = _React$useState2[1];
291 var onHandleOffsetChange = function onHandleOffsetChange(offset, valueIndex) {
292 if (!disabled) {
293 var next = offsetValues(rawValues, offset, valueIndex);
294 onBeforeChange === null || onBeforeChange === void 0 || onBeforeChange(getTriggerValue(rawValues));
295 triggerChange(next.values);
296 setKeyboardValue(next.value);
297 }
298 };
299 React.useEffect(function () {
300 if (keyboardValue !== null) {
301 var valueIndex = rawValues.indexOf(keyboardValue);
302 if (valueIndex >= 0) {
303 handlesRef.current.focus(valueIndex);
304 }
305 }
306 setKeyboardValue(null);
307 }, [keyboardValue]);
308
309 // ============================= Drag =============================
310 var mergedDraggableTrack = React.useMemo(function () {
311 if (draggableTrack && mergedStep === null) {
312 if (process.env.NODE_ENV !== 'production') {
313 (0, _warning.default)(false, '`draggableTrack` is not supported when `step` is `null`.');
314 }
315 return false;
316 }
317 return draggableTrack;
318 }, [draggableTrack, mergedStep]);
319 var onStartMove = function onStartMove(e, valueIndex) {
320 onStartDrag(e, valueIndex);
321 onBeforeChange === null || onBeforeChange === void 0 || onBeforeChange(getTriggerValue(rawValuesRef.current));
322 };
323
324 // Auto focus for updated handle
325 var dragging = draggingIndex !== -1;
326 React.useEffect(function () {
327 if (!dragging) {
328 var valueIndex = rawValues.lastIndexOf(draggingValue);
329 handlesRef.current.focus(valueIndex);
330 }
331 }, [dragging]);
332
333 // =========================== Included ===========================
334 var sortedCacheValues = React.useMemo(function () {
335 return (0, _toConsumableArray2.default)(cacheValues).sort(function (a, b) {
336 return a - b;
337 });
338 }, [cacheValues]);
339
340 // Provide a range values with included [min, max]
341 // Used for Track, Mark & Dot
342 var _React$useMemo = React.useMemo(function () {
343 if (!range) {
344 return [mergedMin, sortedCacheValues[0]];
345 }
346 return [sortedCacheValues[0], sortedCacheValues[sortedCacheValues.length - 1]];
347 }, [sortedCacheValues, range, mergedMin]),
348 _React$useMemo2 = (0, _slicedToArray2.default)(_React$useMemo, 2),
349 includedStart = _React$useMemo2[0],
350 includedEnd = _React$useMemo2[1];
351
352 // ============================= Refs =============================
353 React.useImperativeHandle(ref, function () {
354 return {
355 focus: function focus() {
356 handlesRef.current.focus(0);
357 },
358 blur: function blur() {
359 var _containerRef$current2;
360 var _document = document,
361 activeElement = _document.activeElement;
362 if ((_containerRef$current2 = containerRef.current) !== null && _containerRef$current2 !== void 0 && _containerRef$current2.contains(activeElement)) {
363 activeElement === null || activeElement === void 0 || activeElement.blur();
364 }
365 }
366 };
367 });
368
369 // ========================== Auto Focus ==========================
370 React.useEffect(function () {
371 if (autoFocus) {
372 handlesRef.current.focus(0);
373 }
374 }, []);
375
376 // =========================== Context ============================
377 var context = React.useMemo(function () {
378 return {
379 min: mergedMin,
380 max: mergedMax,
381 direction: direction,
382 disabled: disabled,
383 keyboard: keyboard,
384 step: mergedStep,
385 included: included,
386 includedStart: includedStart,
387 includedEnd: includedEnd,
388 range: range,
389 tabIndex: tabIndex,
390 ariaLabelForHandle: ariaLabelForHandle,
391 ariaLabelledByForHandle: ariaLabelledByForHandle,
392 ariaValueTextFormatterForHandle: ariaValueTextFormatterForHandle,
393 styles: styles || {},
394 classNames: classNames || {}
395 };
396 }, [mergedMin, mergedMax, direction, disabled, keyboard, mergedStep, included, includedStart, includedEnd, range, tabIndex, ariaLabelForHandle, ariaLabelledByForHandle, ariaValueTextFormatterForHandle, styles, classNames]);
397
398 // ============================ Render ============================
399 return /*#__PURE__*/React.createElement(_context.default.Provider, {
400 value: context
401 }, /*#__PURE__*/React.createElement("div", {
402 ref: containerRef,
403 className: (0, _classnames.default)(prefixCls, className, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(prefixCls, "-disabled"), disabled), "".concat(prefixCls, "-vertical"), vertical), "".concat(prefixCls, "-horizontal"), !vertical), "".concat(prefixCls, "-with-marks"), markList.length)),
404 style: style,
405 onMouseDown: onSliderMouseDown
406 }, /*#__PURE__*/React.createElement("div", {
407 className: (0, _classnames.default)("".concat(prefixCls, "-rail"), classNames === null || classNames === void 0 ? void 0 : classNames.rail),
408 style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, railStyle), styles === null || styles === void 0 ? void 0 : styles.rail)
409 }), /*#__PURE__*/React.createElement(_Tracks.default, {
410 prefixCls: prefixCls,
411 style: trackStyle,
412 values: sortedCacheValues,
413 startPoint: startPoint,
414 onStartMove: mergedDraggableTrack ? onStartMove : undefined
415 }), /*#__PURE__*/React.createElement(_Steps.default, {
416 prefixCls: prefixCls,
417 marks: markList,
418 dots: dots,
419 style: dotStyle,
420 activeStyle: activeDotStyle
421 }), /*#__PURE__*/React.createElement(_Handles.default, {
422 ref: handlesRef,
423 prefixCls: prefixCls,
424 style: handleStyle,
425 values: cacheValues,
426 draggingIndex: draggingIndex,
427 onStartMove: onStartMove,
428 onOffsetChange: onHandleOffsetChange,
429 onFocus: onFocus,
430 onBlur: onBlur,
431 handleRender: handleRender,
432 activeHandleRender: activeHandleRender,
433 onChangeComplete: finishChange
434 }), /*#__PURE__*/React.createElement(_Marks.default, {
435 prefixCls: prefixCls,
436 marks: markList,
437 onClick: changeToCloseValue
438 })));
439});
440if (process.env.NODE_ENV !== 'production') {
441 Slider.displayName = 'Slider';
442}
443var _default = exports.default = Slider;
\No newline at end of file