material-ui-pickers-v4
Version:
React components, that implements material design pickers for material-ui v4 with updated material ui
385 lines (329 loc) • 11.9 kB
JavaScript
import { createElement, Component } from 'react';
import { oneOf, number, func, arrayOf, node, bool, any } from 'prop-types';
import clsx from 'clsx';
import { withStyles, createStyles } from '@material-ui/core';
import _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';
import _createClass from '@babel/runtime/helpers/esm/createClass';
import _inherits from '@babel/runtime/helpers/esm/inherits';
import _possibleConstructorReturn from '@babel/runtime/helpers/esm/possibleConstructorReturn';
import _getPrototypeOf from '@babel/runtime/helpers/esm/getPrototypeOf';
var ClockType;
(function (ClockType) {
ClockType["HOURS"] = "hours";
ClockType["MINUTES"] = "minutes";
ClockType["SECONDS"] = "seconds";
})(ClockType || (ClockType = {}));
var ClockType$1 = ClockType;
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var ClockPointer = /*#__PURE__*/function (_React$Component) {
_inherits(ClockPointer, _React$Component);
var _super = _createSuper(ClockPointer);
function ClockPointer() {
var _this;
_classCallCheck(this, ClockPointer);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
_this.state = {
toAnimateTransform: false,
previousType: undefined
};
_this.getAngleStyle = function () {
var _this$props = _this.props,
value = _this$props.value,
isInner = _this$props.isInner,
type = _this$props.type;
var max = type === ClockType$1.HOURS ? 12 : 60;
var angle = 360 / max * value;
if (type === ClockType$1.HOURS && value > 12) {
angle -= 360; // round up angle to max 360 degrees
}
return {
height: isInner ? '26%' : '40%',
transform: "rotateZ(".concat(angle, "deg)")
};
};
return _this;
}
_createClass(ClockPointer, [{
key: "render",
value: function render() {
var _this$props2 = this.props,
classes = _this$props2.classes,
hasSelected = _this$props2.hasSelected;
return /*#__PURE__*/createElement("div", {
style: this.getAngleStyle(),
className: clsx(classes.pointer, this.state.toAnimateTransform && classes.animateTransform)
}, /*#__PURE__*/createElement("div", {
className: clsx(classes.thumb, hasSelected && classes.noPoint)
}));
}
}]);
return ClockPointer;
}(Component);
ClockPointer.getDerivedStateFromProps = function (nextProps, state) {
if (nextProps.type !== state.previousType) {
return {
toAnimateTransform: true,
previousType: nextProps.type
};
}
return {
toAnimateTransform: false,
previousType: nextProps.type
};
};
var styles = function styles(theme) {
return createStyles({
pointer: {
width: 2,
backgroundColor: theme.palette.primary.main,
position: 'absolute',
left: 'calc(50% - 1px)',
bottom: '50%',
transformOrigin: 'center bottom 0px'
},
animateTransform: {
transition: theme.transitions.create(['transform', 'height'])
},
thumb: {
width: 4,
height: 4,
backgroundColor: theme.palette.primary.contrastText,
borderRadius: '100%',
position: 'absolute',
top: -21,
left: -15,
border: "14px solid ".concat(theme.palette.primary.main),
boxSizing: 'content-box'
},
noPoint: {
backgroundColor: theme.palette.primary.main
}
});
};
var ClockPointer$1 = withStyles(styles, {
name: 'MuiPickersClockPointer'
})(ClockPointer);
var center = {
x: 260 / 2,
y: 260 / 2
};
var basePoint = {
x: center.x,
y: 0
};
var cx = basePoint.x - center.x;
var cy = basePoint.y - center.y;
var rad2deg = function rad2deg(rad) {
return rad * 57.29577951308232;
};
var getAngleValue = function getAngleValue(step, offsetX, offsetY) {
var x = offsetX - center.x;
var y = offsetY - center.y;
var atan = Math.atan2(cx, cy) - Math.atan2(x, y);
var deg = rad2deg(atan);
deg = Math.round(deg / step) * step;
deg %= 360;
var value = Math.floor(deg / step) || 0;
var delta = Math.pow(x, 2) + Math.pow(y, 2);
var distance = Math.sqrt(delta);
return {
value: value,
distance: distance
};
};
var getHours = function getHours(offsetX, offsetY, ampm) {
var _getAngleValue = getAngleValue(30, offsetX, offsetY),
value = _getAngleValue.value,
distance = _getAngleValue.distance;
value = value || 12;
if (!ampm) {
if (distance < 90) {
value += 12;
value %= 24;
}
} else {
value %= 12;
}
return value;
};
var getMinutes = function getMinutes(offsetX, offsetY) {
var step = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
var angleStep = step * 6;
var _getAngleValue2 = getAngleValue(angleStep, offsetX, offsetY),
value = _getAngleValue2.value;
value = value * step % 60;
return value;
};
var getMeridiem = function getMeridiem(date, utils) {
return utils.getHours(date) >= 12 ? 'pm' : 'am';
};
var convertToMeridiem = function convertToMeridiem(time, meridiem, ampm, utils) {
if (ampm) {
var currentMeridiem = utils.getHours(time) >= 12 ? 'pm' : 'am';
if (currentMeridiem !== meridiem) {
var hours = meridiem === 'am' ? utils.getHours(time) - 12 : utils.getHours(time) + 12;
return utils.setHours(time, hours);
}
}
return time;
};
function _createSuper$1(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct$1(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _isNativeReflectConstruct$1() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var Clock = /*#__PURE__*/function (_React$Component) {
_inherits(Clock, _React$Component);
var _super = _createSuper$1(Clock);
function Clock() {
var _this;
_classCallCheck(this, Clock);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _super.call.apply(_super, [this].concat(args));
_this.isMoving = false;
_this.handleTouchMove = function (e) {
_this.isMoving = true;
_this.setTime(e);
};
_this.handleTouchEnd = function (e) {
if (_this.isMoving) {
_this.setTime(e, true);
_this.isMoving = false;
}
};
_this.handleMove = function (e) {
e.preventDefault();
e.stopPropagation(); // MouseEvent.which is deprecated, but MouseEvent.buttons is not supported in Safari
var isButtonPressed = typeof e.buttons === 'undefined' ? e.nativeEvent.which === 1 : e.buttons === 1;
if (isButtonPressed) {
_this.setTime(e.nativeEvent, false);
}
};
_this.handleMouseUp = function (e) {
if (_this.isMoving) {
_this.isMoving = false;
}
_this.setTime(e.nativeEvent, true);
};
_this.hasSelected = function () {
var _this$props = _this.props,
type = _this$props.type,
value = _this$props.value;
if (type === ClockType$1.HOURS) {
return true;
}
return value % 5 === 0;
};
return _this;
}
_createClass(Clock, [{
key: "setTime",
value: function setTime(e) {
var isFinish = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var offsetX = e.offsetX,
offsetY = e.offsetY;
if (typeof offsetX === 'undefined') {
var rect = e.target.getBoundingClientRect();
offsetX = e.changedTouches[0].clientX - rect.left;
offsetY = e.changedTouches[0].clientY - rect.top;
}
var value = this.props.type === ClockType$1.SECONDS || this.props.type === ClockType$1.MINUTES ? getMinutes(offsetX, offsetY, this.props.minutesStep) : getHours(offsetX, offsetY, Boolean(this.props.ampm));
this.props.onChange(value, isFinish);
}
}, {
key: "render",
value: function render() {
var _this$props2 = this.props,
classes = _this$props2.classes,
value = _this$props2.value,
children = _this$props2.children,
type = _this$props2.type,
ampm = _this$props2.ampm;
var isPointerInner = !ampm && type === ClockType$1.HOURS && (value < 1 || value > 12);
return /*#__PURE__*/createElement("div", {
className: classes.container
}, /*#__PURE__*/createElement("div", {
className: classes.clock
}, /*#__PURE__*/createElement("div", {
role: "menu",
tabIndex: -1,
className: classes.squareMask,
onTouchMove: this.handleTouchMove,
onTouchEnd: this.handleTouchEnd,
onMouseUp: this.handleMouseUp,
onMouseMove: this.handleMove
}), /*#__PURE__*/createElement("div", {
className: classes.pin
}), /*#__PURE__*/createElement(ClockPointer$1, {
type: type,
value: value,
isInner: isPointerInner,
hasSelected: this.hasSelected()
}), children));
}
}]);
return Clock;
}(Component);
process.env.NODE_ENV !== "production" ? Clock.propTypes = {
type: oneOf(Object.keys(ClockType$1).map(function (key) {
return ClockType$1[key];
})).isRequired,
value: number.isRequired,
onChange: func.isRequired,
children: arrayOf(node).isRequired,
ampm: bool,
minutesStep: number,
innerRef: any
} : void 0;
Clock.defaultProps = {
ampm: false,
minutesStep: 1
};
var styles$1 = function styles(theme) {
return createStyles({
container: {
display: 'flex',
justifyContent: 'center',
alignItems: 'flex-end',
margin: "".concat(theme.spacing(2), "px 0 ").concat(theme.spacing(1), "px")
},
clock: {
backgroundColor: 'rgba(0,0,0,.07)',
borderRadius: '50%',
height: 260,
width: 260,
position: 'relative',
pointerEvents: 'none'
},
squareMask: {
width: '100%',
height: '100%',
position: 'absolute',
pointerEvents: 'auto',
outline: 'none',
touchActions: 'none',
userSelect: 'none',
'&:active': {
cursor: 'move'
}
},
pin: {
width: 6,
height: 6,
borderRadius: '50%',
backgroundColor: theme.palette.primary.main,
position: 'absolute',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)'
}
});
};
var Clock$1 = withStyles(styles$1, {
name: 'MuiPickersClock'
})(Clock);
export { Clock as C, Clock$1 as a, ClockType$1 as b, convertToMeridiem as c, getMeridiem as g, styles$1 as s };
//# sourceMappingURL=Clock-f69d5d8d.js.map