zrmc
Version:
ZRMC is an ES7 React wrapper for Material Components Web.
343 lines (299 loc) • 10.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _extends2 = require("babel-runtime/helpers/extends");
var _extends3 = _interopRequireDefault(_extends2);
var _objectWithoutProperties2 = require("babel-runtime/helpers/objectWithoutProperties");
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require("react");
var _react2 = _interopRequireDefault(_react);
var _propTypes = require("prop-types");
var _propTypes2 = _interopRequireDefault(_propTypes);
var _ = require("../");
var _2 = _interopRequireDefault(_);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* mdc-slider
*
* See:
* https://material.io/develop/web/components/input-controls/sliders/
*/
var MDC_SLIDER = "mdc-slider"; /**
* Copyright (c) 2015-present, CWB SAS
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var Slider = function (_Component) {
(0, _inherits3.default)(Slider, _Component);
function Slider(props) {
(0, _classCallCheck3.default)(this, Slider);
var _this = (0, _possibleConstructorReturn3.default)(this, (Slider.__proto__ || Object.getPrototypeOf(Slider)).call(this, props));
_this.onBlur = function () {
_this.setState({ focused: false, active: false });
};
_this.onFocus = function () {
if (!_this.props.disabled) {
_this.setState({ focused: true });
}
};
_this.setRef = function (c) {
_this.thumbRef = c;
};
_this.handleMoveStart = function (event) {
if (!_this.props.disabled && _this.state.focused) {
event.preventDefault();
_this.setState({ active: true });
var value = _this.moveThumbPosition(event);
if (_this.props.onChange) {
_this.props.onChange(value);
}
}
};
_this.handleMoveChange = function (event) {
if (!_this.props.disabled && _this.state.active) {
event.preventDefault();
var value = _this.moveThumbPosition(event);
if (_this.props.onChange) {
_this.props.onChange(value);
}
}
};
_this.handleMoveEnd = function (event) {
if (!_this.props.disabled) {
event.preventDefault();
_this.setState({ active: false });
var value = _this.moveThumbPosition(event);
if (_this.props.onInput) {
_this.props.onInput(value);
}
}
};
_this.state = {
focused: false,
active: false,
min: _this.props.min,
max: _this.props.max,
value: _this.props.value
};
_this.contentWidth = 0;
return _this;
}
(0, _createClass3.default)(Slider, [{
key: "componentDidMount",
value: function componentDidMount() {
this.updateContent();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this.updateContent();
}
}, {
key: "setSliderThumbPosition",
value: function setSliderThumbPosition(min, max, value) {
var position = 0;
if (this.contentWidth > 0 && max > 0 && max > min) {
position = this.contentWidth / (max - min) * value;
}
return "transform: translateX(" + position + "px) translateX(-50%);";
}
}, {
key: "moveThumbPosition",
value: function moveThumbPosition(event) {
var bounds = this.contentRef.getBoundingClientRect();
var x = event.clientX - bounds.left;
var _state = this.state,
min = _state.min,
max = _state.max;
var value = 0;
if (this.contentWidth > 0 && max > 0 && min < this.state.max) {
value = (max - min) / this.contentWidth * x + min;
if (value > max) {
value = max;
} else if (value < min) {
value = min;
}
if (this.props.discrete) {
value = Math.round(value);
}
}
if (value !== this.state.value) {
this.setState({ value: value });
}
}
}, {
key: "updateContent",
value: function updateContent() {
if (this.contentRef && this.thumbRef) {
var width = this.contentRef.clientWidth;
this.contentWidth = width;
var _state2 = this.state,
min = _state2.min,
max = _state2.max,
value = _state2.value;
this.thumbRef.style = this.setSliderThumbPosition(min, max, value);
}
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _props = this.props,
discrete = _props.discrete,
disabled = _props.disabled,
label = _props.label,
displayMarker = _props.displayMarker,
onChange = _props.onChange,
onInput = _props.onInput,
props = (0, _objectWithoutProperties3.default)(_props, ["discrete", "disabled", "label", "displayMarker", "onChange", "onInput"]);
var classes = MDC_SLIDER;
var container = void 0;
var _state3 = this.state,
focused = _state3.focused,
active = _state3.active,
min = _state3.min,
max = _state3.max,
value = _state3.value;
if (discrete) {
classes += " mdc-slider--discrete";
container = _react2.default.createElement(
"div",
{ className: "mdc-slider__thumb-container", ref: this.setRef },
_react2.default.createElement(
"div",
{ className: "mdc-slider__pin" },
_react2.default.createElement(
"span",
{ className: "mdc-slider__pin-value-marker" },
value
)
),
_react2.default.createElement(
"svg",
{ className: "mdc-slider__thumb", width: "21", height: "21" },
_react2.default.createElement("circle", { cx: "10.5", cy: "10.5", r: "7.875" })
),
_react2.default.createElement("div", { className: "mdc-slider__focus-ring" })
);
} else {
container = _react2.default.createElement(
"div",
{ className: "mdc-slider__thumb-container", ref: this.setRef },
_react2.default.createElement(
"svg",
{ className: "mdc-slider__thumb", width: "21", height: "21" },
_react2.default.createElement("circle", { cx: "10.5", cy: "10.5", r: "7.875" })
),
_react2.default.createElement("div", { className: "mdc-slider__focus-ring" })
);
}
var p = {
tabIndex: "0",
role: "slider",
"aria-valuemin": min,
"aria-valuemax": max,
"aria-valuenow": value,
"aria-label": label,
onBlur: this.onBlur,
onFocus: this.onFocus,
onMouseDown: this.handleMoveStart,
onMouseUp: this.handleMoveEnd,
onMouseMove: this.handleMoveChange,
onTouchStart: this.handleMoveStart,
onTouchEnd: this.handleMoveEnd,
onTouchMove: this.handleMoveChange,
onTouchCancel: this.handleMoveEnd,
ref: function ref(c) {
_this2.contentRef = c;
}
};
if (disabled) {
classes += " mdc-slider--disabled";
p["aria-disabled"] = "true";
} else if (focused) {
classes += " mdc-slider--focus";
}
if (active) {
classes += " mdc-slider--active";
}
var styleTrack = void 0;
var marker = void 0;
if (discrete && displayMarker) {
if (max > 0) {
var scale = value / max;
styleTrack = { transform: "scaleX(" + scale + ")" };
}
classes += " mdc-slider--display-markers";
var markers = [];
for (var i = 0; i < max; i += 1) {
var key = "marker_" + i;
markers.push(_react2.default.createElement("div", { className: "mdc-slider__track-marker", key: key }));
}
marker = _react2.default.createElement(
"div",
{ className: "mdc-slider__track-marker-container" },
markers
);
}
return _2.default.render(_react2.default.createElement(
"div",
(0, _extends3.default)({ className: classes }, p),
_react2.default.createElement(
"div",
{ className: "mdc-slider__track-container" },
_react2.default.createElement("div", { className: "mdc-slider__track", style: styleTrack }),
marker
),
container
), props);
}
}], [{
key: "getDerivedStateFromProps",
value: function getDerivedStateFromProps(nextProps, prevState) {
var min = nextProps.min,
max = nextProps.max,
value = nextProps.value;
if ((min !== prevState.min || max !== prevState.max || value !== prevState.value) && !nextProps.derivedState) {
return { min: min, max: max, value: value };
}
return null;
}
}]);
return Slider;
}(_react.Component);
exports.default = Slider;
Slider.defaultProps = {
mdcElement: MDC_SLIDER,
discrete: false,
disabled: false,
min: 0,
max: 100,
value: 0,
label: "",
displayMarker: false,
onInput: null,
onChange: null
};
Slider.propTypes = {
mdcElement: _propTypes2.default.string,
discrete: _propTypes2.default.bool,
disabled: _propTypes2.default.bool,
min: _propTypes2.default.number,
max: _propTypes2.default.number,
value: _propTypes2.default.number,
label: _propTypes2.default.string,
displayMarker: _propTypes2.default.bool,
onInput: _propTypes2.default.func,
onChange: _propTypes2.default.func
};