@alifd/next
Version:
A configurable component library for web built on React.
342 lines (271 loc) • 10.7 kB
JavaScript
'use strict';
exports.__esModule = true;
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 _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require('babel-runtime/helpers/inherits');
var _inherits3 = _interopRequireDefault(_inherits2);
var _class, _temp, _initialiseProps;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactLifecyclesCompat = require('react-lifecycles-compat');
var _propTypes = require('prop-types');
var PT = _interopRequireWildcard(_propTypes);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _zhCn = require('../locale/zh-cn');
var _zhCn2 = _interopRequireDefault(_zhCn);
var _util = require('../util');
var _propTypes2 = require('./prop-types');
var _propTypes3 = _interopRequireDefault(_propTypes2);
var _constant = require('./constant');
var _headerPanel = require('./panels/header-panel');
var _headerPanel2 = _interopRequireDefault(_headerPanel);
var _dateTable = require('./panels/date-table');
var _dateTable2 = _interopRequireDefault(_dateTable);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var pickProps = _util.obj.pickProps,
pickOthers = _util.obj.pickOthers;
// CALENDAR_MODE => DATE_PANEL_MODE
function getPanelMode(mode) {
return mode && (mode === _constant.CALENDAR_MODE.YEAR ? _constant.DATE_PANEL_MODE.MONTH : _constant.DATE_PANEL_MODE.DATE);
}
function isValueChanged(newVal, oldVal) {
return newVal !== oldVal && !(0, _util.datejs)(newVal).isSame((0, _util.datejs)(oldVal));
}
var Calendar = (_temp = _class = function (_React$Component) {
(0, _inherits3.default)(Calendar, _React$Component);
function Calendar(props) {
(0, _classCallCheck3.default)(this, Calendar);
var _this = (0, _possibleConstructorReturn3.default)(this, _React$Component.call(this, props));
_initialiseProps.call(_this);
var defaultValue = props.defaultValue,
mode = props.mode;
var value = 'value' in props ? props.value : defaultValue;
var panelValue = (0, _util.datejs)('panelValue' in props ? props.panelValue : value || props.defaultPanelValue);
var panelMode = props.panelMode || getPanelMode(mode) || _constant.DATE_PANEL_MODE.DATE;
_this.state = {
mode: mode,
value: value,
panelMode: panelMode,
panelValue: panelValue.isValid() ? panelValue : (0, _util.datejs)()
};
return _this;
}
Calendar.getDerivedStateFromProps = function getDerivedStateFromProps(props, state) {
var newState = null;
var value = void 0;
var panelValue = void 0;
if ('value' in props && isValueChanged(props.value, state.value)) {
value = props.value;
panelValue = (0, _util.datejs)(value);
}
if ('panelValue' in props) {
panelValue = (0, _util.datejs)(props.panelValue);
}
// panelValue不能是无效值
if (panelValue) {
panelValue = panelValue.isValid() ? panelValue : (0, _util.datejs)();
newState = {
panelValue: panelValue
};
}
if (value) {
newState.value = value;
}
return newState;
};
Calendar.prototype.render = function render() {
var value = 'value' in this.props ? (0, _util.datejs)(this.props.value) : this.state.value;
var _state = this.state,
panelMode = _state.panelMode,
mode = _state.mode,
panelValue = _state.panelValue;
var _props = this.props,
prefix = _props.prefix,
shape = _props.shape,
rtl = _props.rtl,
className = _props.className,
restProps = (0, _objectWithoutProperties3.default)(_props, ['prefix', 'shape', 'rtl', 'className']);
var sharedProps = {
rtl: rtl,
prefix: prefix,
shape: shape,
value: value,
panelValue: panelValue
};
var headerPanelProps = (0, _extends3.default)({}, pickProps(_headerPanel2.default.propTypes, restProps), sharedProps, {
mode: mode,
panelMode: panelMode,
onPanelValueChange: this.onPanelValueChange,
onModeChange: this.onModeChange,
onPanelModeChange: this.onPanelModeChange,
showModeSwitch: this.props.mode !== _constant.CALENDAR_MODE.YEAR
});
var dateTableProps = (0, _extends3.default)({}, pickProps(_dateTable2.default.propTypes, restProps), sharedProps, {
mode: panelMode,
onSelect: this.onDateSelect
});
var classNames = (0, _classnames2.default)([prefix + 'calendar2', prefix + 'calendar2-' + shape, className]);
return _react2.default.createElement(
'div',
(0, _extends3.default)({}, pickOthers(Calendar.propTypes, restProps), { dir: rtl ? 'rtl' : undefined, className: classNames }),
_react2.default.createElement(_headerPanel2.default, headerPanelProps),
_react2.default.createElement(
'div',
{ className: prefix + 'calendar2-body' },
_react2.default.createElement(_dateTable2.default, dateTableProps)
)
);
};
return Calendar;
}(_react2.default.Component), _class.propTypes = {
rtl: PT.bool,
name: PT.string,
prefix: PT.string,
locale: PT.object,
/**
* 展现形态
*/
shape: _propTypes3.default.shape,
/*
* 日期模式: month | year
*/
mode: _propTypes3.default.mode,
/**
* 默认选中的日期(受控)
*/
value: _propTypes3.default.date,
/**
* 默认选中的日期
*/
defaultValue: _propTypes3.default.date,
/**
* 面板显示的日期(受控)
*/
panelValue: _propTypes3.default.date,
/**
* 面板默认显示的日期
*/
defaultPanelValue: _propTypes3.default.date,
/**
* 不可选择的日期
*/
disabledDate: PT.func,
/**
* 可显示的日期范围
*/
validRange: PT.arrayOf(_propTypes3.default.date),
/**
* 自定义日期渲染
*/
dateCellRender: PT.func,
quarterCellRender: PT.func,
monthCellRender: PT.func,
yearCellRender: PT.func,
/**
* 自定义头部渲染
*/
headerRender: PT.func,
/**
* 日期变化回调
*/
onChange: PT.func,
/**
* 点击选择日期回调
*/
onSelect: PT.func,
/**
* 日期面板变化回调
*/
onPanelChange: PT.func,
cellProps: PT.object,
cellClassName: PT.oneOfType([PT.func, PT.string]),
panelMode: PT.any,
onPrev: PT.func,
onNext: PT.func,
onSuperPrev: PT.func,
onSuperNext: PT.func,
colNum: PT.number
}, _class.defaultProps = {
rtl: false,
prefix: 'next-',
locale: _zhCn2.default.Calendar,
shape: _constant.CALENDAR_SHAPE.FULLSCREEN,
mode: _constant.CALENDAR_MODE.MONTH,
defaultPanelValue: (0, _util.datejs)()
}, _initialiseProps = function _initialiseProps() {
var _this2 = this;
this.switchPanelMode = function (mode) {
var MONTH = _constant.DATE_PANEL_MODE.MONTH,
YEAR = _constant.DATE_PANEL_MODE.YEAR,
DECADE = _constant.DATE_PANEL_MODE.DECADE;
var originalPanelMode = _this2.props.panelMode || getPanelMode(mode);
switch (mode) {
case YEAR:
return MONTH;
case DECADE:
return YEAR;
default:
return originalPanelMode;
}
};
this.shouldSwitchPanelMode = function () {
var _props2 = _this2.props,
mode = _props2.mode,
shape = _props2.shape;
var panelMode = _this2.state.panelMode;
var originalPanelMode = _this2.props.panelMode || getPanelMode(mode);
return shape === _constant.CALENDAR_SHAPE.PANEL && panelMode !== originalPanelMode;
};
this.onDateSelect = function (value, _, _ref) {
var isCurrent = _ref.isCurrent;
var panelMode = _this2.state.panelMode;
var unit = panelMode === 'date' ? 'day' : panelMode;
if (_this2.shouldSwitchPanelMode()) {
_this2.onPanelChange(value, _this2.switchPanelMode(panelMode), 'DATESELECT_VALUE_SWITCH_MODE');
} else {
isCurrent || _this2.onPanelValueChange(value, 'DATESELECT');
value.isSame(_this2.state.value, unit) || _this2.onChange(value);
_util.func.invoke(_this2.props, 'onSelect', [value]);
}
};
this.onModeChange = function (mode, reason) {
_this2.setState({
mode: mode
});
var panelMode = getPanelMode(mode);
if (_this2.state.panelMode !== panelMode) {
_this2.onPanelModeChange(panelMode, reason);
}
};
this.onPanelValueChange = function (panelValue, reason) {
_this2.onPanelChange(panelValue, _this2.state.panelMode, reason);
};
this.onPanelModeChange = function (panelMode, reason) {
_this2.onPanelChange(_this2.state.panelValue, panelMode, reason);
};
this.onPanelChange = function (value, mode, reason) {
_this2.setState({
panelMode: mode,
panelValue: value
});
_util.func.invoke(_this2.props, 'onPanelChange', [value, mode, reason]);
};
this.onChange = function (value) {
_this2.setState({
value: value,
panelValue: value
});
_util.func.invoke(_this2.props, 'onChange', [value]);
};
}, _temp);
Calendar.displayName = 'Calendar';
exports.default = (0, _reactLifecyclesCompat.polyfill)(Calendar);
module.exports = exports['default'];