@atlaskit/range
Version:
A range lets users choose an approximate value on a slider.
95 lines (91 loc) • 5.31 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _noop = _interopRequireDefault(require("@atlaskit/ds-lib/noop"));
var _styled = require("./styled");
var _excluded = ["isDisabled", "defaultValue", "max", "min", "onChange", "step", "value", "testId"];
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
// Combine omits the keys of the second from the first so in case of overlap the props of the second are used.
// OwnProps is used for external documentation, but does not list every property supported by Range.
// So we combine (a reduced list of) HTMLInputElement attributes with OwnProps to get the full type.
var snapToStep = function snapToStep(value, min, step) {
// Normalise the value to allow for division properly with different min values
var adjustedValue = value - min;
// Find the number of steps the value covers
var numSteps = Math.round(adjustedValue / step);
// Convert numSteps back into original range
return numSteps * step + min;
};
var getRoundedPercentValue = function getRoundedPercentValue(value, min, max, step) {
var percent = '0';
if (min < max && value > min) {
var snappedValue = snapToStep(value, min, step);
percent = ((snappedValue - min) / (max - min) * 100).toFixed(2);
}
return percent;
};
var noop = _noop.default;
/**
* __Range__
*
* A range lets users choose an approximate value on a slider.
*
* - [Examples](https://atlassian.design/components/range/examples)
* - [Code](https://atlassian.design/components/range/code)
* - [Usage](https://atlassian.design/components/range/usage)
*/
var Range = /*#__PURE__*/(0, _react.forwardRef)(function Range(props, ref) {
var _props$isDisabled = props.isDisabled,
isDisabled = _props$isDisabled === void 0 ? false : _props$isDisabled,
_props$defaultValue = props.defaultValue,
defaultValue = _props$defaultValue === void 0 ? 50 : _props$defaultValue,
_props$max = props.max,
max = _props$max === void 0 ? 100 : _props$max,
_props$min = props.min,
min = _props$min === void 0 ? 0 : _props$min,
_props$onChange = props.onChange,
onChange = _props$onChange === void 0 ? noop : _props$onChange,
_props$step = props.step,
step = _props$step === void 0 ? 1 : _props$step,
propsValue = props.value,
testId = props.testId,
rest = (0, _objectWithoutProperties2.default)(props, _excluded);
var spreadProps = _objectSpread({
max: max,
min: min,
step: step,
ref: ref
}, rest);
var _useState = (0, _react.useState)(propsValue !== undefined ? propsValue : defaultValue),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
value = _useState2[0],
setValue = _useState2[1];
var handleChange = (0, _react.useCallback)(function (e) {
var newValue = Number(e.target.value);
setValue(newValue);
// Note use of newValue to ensure up=to-date value is used
onChange(newValue);
}, [onChange]);
var renderValue = propsValue !== undefined ? propsValue : value;
var valuePercent = getRoundedPercentValue(renderValue, min, max, step);
return /*#__PURE__*/_react.default.createElement(_styled.Input, (0, _extends2.default)({
type: "range",
disabled: isDisabled,
onChange: handleChange,
value: renderValue,
valuePercent: valuePercent,
"data-testid": testId
}, spreadProps));
});
var _default = exports.default = Range;