UNPKG

zent

Version:

一套前端设计语言和基于React的实现

459 lines (359 loc) 12.6 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); 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 _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _input = require('../input'); var _input2 = _interopRequireDefault(_input); var _popover = require('../popover'); var _popover2 = _interopRequireDefault(_popover); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _isArray = require('lodash/isArray'); var _isArray2 = _interopRequireDefault(_isArray); var _formatDate = require('zan-utils/date/formatDate'); var _formatDate2 = _interopRequireDefault(_formatDate); var _parseDate = require('zan-utils/date/parseDate'); var _parseDate2 = _interopRequireDefault(_parseDate); var _getWidth = require('../utils/getWidth'); var _getWidth2 = _interopRequireDefault(_getWidth); var _DatePanel = require('./date/DatePanel'); var _DatePanel2 = _interopRequireDefault(_DatePanel); var _PanelFooter = require('./common/PanelFooter'); var _PanelFooter2 = _interopRequireDefault(_PanelFooter); var _utils = require('./utils'); var _date = require('./utils/date'); var _constants = require('./constants/'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function getSelectedWeek(val) { var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; var offset = val.getDay(); return [(0, _utils.goDays)(val, start - offset), (0, _utils.goDays)(val, 6 + start - offset)]; } function extractStateFromProps(props) { var selected = void 0; var actived = void 0; var showPlaceholder = void 0; var openPanel = props.openPanel, value = props.value, format = props.format, min = props.min, max = props.max, defaultValue = props.defaultValue, startDay = props.startDay; // 如果 value 是数组就取数组第一个值,否则就取 value var hasValue = (0, _isArray2['default'])(value) ? value[0] : value; if (hasValue) { var tmp = (0, _parseDate2['default'])(hasValue, format); if (tmp) { showPlaceholder = false; selected = getSelectedWeek(tmp, startDay); actived = (0, _date.setTime)(tmp); } else { // eslint-disable-line showPlaceholder = true; actived = (0, _date.dayStart)(); } } else { showPlaceholder = true; /** * 当前面板显示优先级: * defalutValue > min > max */ if (defaultValue) { actived = (0, _parseDate2['default'])(defaultValue, format); } else if (min) { actived = (0, _parseDate2['default'])(min, format); } else if (max) { actived = (0, _parseDate2['default'])(max, format); } else { actived = (0, _date.dayStart)(); } actived = (0, _parseDate2['default'])(actived, format); } /** * actived 用来临时存放日期,改变年份和月份的时候只会改动 actived 的值 * selected 用来存放用户选择的日期,点击日期时会设置 selected 的值 */ var ret = void 0; if (selected) { ret = selected.map(function (item) { return (0, _formatDate2['default'])(item, props.format); }); } return { value: ret, actived: actived, selected: selected, openPanel: openPanel, showPlaceholder: showPlaceholder }; } var _ref3 = _react2['default'].createElement('span', { className: 'zenticon zenticon-calendar-o' }); var WeekPicker = function (_ref) { (0, _inherits3['default'])(WeekPicker, _ref); function WeekPicker(props) { (0, _classCallCheck3['default'])(this, WeekPicker); var _this = (0, _possibleConstructorReturn3['default'])(this, (WeekPicker.__proto__ || Object.getPrototypeOf(WeekPicker)).call(this, props)); _initialiseProps.call(_this); var value = props.value, valueType = props.valueType; if (valueType) { _this.retType = valueType.toLowerCase(); } else if (value) { if (typeof value === 'number') _this.retType = 'number'; if (value instanceof Date) _this.retType = 'date'; } _this.state = extractStateFromProps(props); return _this; } (0, _createClass3['default'])(WeekPicker, [{ key: 'componentWillReceiveProps', value: function componentWillReceiveProps(next) { var state = extractStateFromProps(next); this.setState(state); } }, { key: 'getReturnValue', /** * 如果传入为数字,返回值也为数字 * 如果传入为 Date 的实例,返回值也为 Date 的实例 * 默认返回 format 格式的字符串 */ value: function getReturnValue(date, format) { if (this.retType === 'number') { return date.getTime(); } if (this.retType === 'date') { return date; } return (0, _formatDate2['default'])(date, format); } }, { key: 'renderPicker', value: function renderPicker() { var _this2 = this; var state = this.state; var props = this.props; var weekPicker = void 0; // 打开面板的时候才渲染 if (state.openPanel) { var isDisabled = this.isDisabled(_utils.CURRENT_DAY); var linkCls = (0, _classnames2['default'])({ 'link--current': true, 'link--disabled': isDisabled }); weekPicker = _react2['default'].createElement( 'div', { className: 'week-picker', ref: function ref(_ref2) { return _this2.picker = _ref2; } }, _react2['default'].createElement( 'div', { onMouseOut: this.onMouseOut }, _react2['default'].createElement(_DatePanel2['default'], { range: state.range, actived: state.actived, selected: state.selected, disabledDate: this.isDisabled, onHover: this.onHover, onSelect: this.onSelectDate, onChange: this.onChangeDate, onPrev: this.onChangeMonth('prev'), onNext: this.onChangeMonth('next') }) ), _react2['default'].createElement(_PanelFooter2['default'], { buttonText: props.confirmText, onClickButton: this.onConfirm, linkText: '\u672C\u5468', linkCls: linkCls, showLink: !isDisabled, onClickLink: function onClickLink() { return _this2.onSelectDate(_utils.CURRENT_DAY); } }) ); } return weekPicker; } }, { key: 'render', value: function render() { var state = this.state; var props = this.props; var wrapperCls = props.prefix + '-datetime-picker ' + props.className; var inputCls = (0, _classnames2['default'])({ 'picker-input': true, 'picker-input--filled': !state.showPlaceholder, 'picker-input--disabled': props.disabled }); var widthStyle = (0, _getWidth2['default'])(props.width); return _react2['default'].createElement( 'div', { style: widthStyle, className: wrapperCls }, _react2['default'].createElement( _popover2['default'], { cushion: 5, visible: state.openPanel, onVisibleChange: this.togglePicker, className: props.prefix + '-datetime-picker-popover ' + props.className + '-popover', position: _constants.popPositionMap[props.popPosition.toLowerCase()] }, _react2['default'].createElement( _popover2['default'].Trigger.Click, null, _react2['default'].createElement( 'div', { style: widthStyle, className: inputCls, onClick: function onClick(evt) { return evt.preventDefault(); } }, _react2['default'].createElement(_input2['default'], { name: props.name, value: state.showPlaceholder ? props.placeholder : state.value.join(' 至 '), onChange: _constants.noop, disabled: props.disabled }), _ref3, _react2['default'].createElement('span', { onClick: this.onClearInput, className: 'zenticon zenticon-close-circle' }) ) ), _react2['default'].createElement( _popover2['default'].Content, null, this.renderPicker() ) ) ); } }]); return WeekPicker; }(_react.PureComponent || _react.Component); WeekPicker.propTypes = (0, _extends3['default'])({}, _constants.commonPropTypes, { startDay: _propTypes2['default'].number }); WeekPicker.defaultProps = (0, _extends3['default'])({}, _constants.commonProps, { placeholder: '请选择自然周', startDay: 1 }); var _initialiseProps = function _initialiseProps() { var _this3 = this; this.retType = 'string'; this.onChangeDate = function (val) { _this3.setState({ actived: val }); }; this.onHover = function (val) { var startDay = _this3.props.startDay; var offset = val.getDay(); var week = [(0, _utils.goDays)(val, -offset + startDay - 1), (0, _utils.goDays)(val, 7 + startDay - offset)]; _this3.setState({ range: week }); }; this.onSelectDate = function (val) { var _props = _this3.props, onClick = _props.onClick, startDay = _props.startDay; var week = getSelectedWeek(val, startDay); _this3.setState({ selected: week }); onClick && onClick(week); }; this.onChangeMonth = function (type) { var typeMap = { prev: -1, next: 1 }; return function () { var actived = _this3.state.actived; var acp = (0, _utils.goMonths)(actived, typeMap[type]); _this3.setState({ actived: acp }); }; }; this.onClearInput = function (evt) { evt.stopPropagation(); _this3.props.onChange([]); }; this.onMouseOut = function (evt) { evt.stopPropagation(); _this3.setState({ range: [] }); }; this.onConfirm = function () { var selected = _this3.state.selected; var _props2 = _this3.props, format = _props2.format, onClose = _props2.onClose, onChange = _props2.onChange; if (selected.length === 0) { return; } var tmp = selected.slice(); if (_this3.isDisabled(tmp[0] || _this3.isDisabled(tmp[1]))) return; var value = tmp.map(function (item) { return (0, _formatDate2['default'])(item, format); }); _this3.setState({ value: value, openPanel: false, showPlaceholder: false, range: [] }); var ret = tmp.map(function (item) { return _this3.getReturnValue(item, format); }); onChange(ret); onClose && onClose(); }; this.isDisabled = function (val) { var _props3 = _this3.props, disabledDate = _props3.disabledDate, min = _props3.min, max = _props3.max, format = _props3.format; if (disabledDate && disabledDate(val)) return true; if (min && val < (0, _parseDate2['default'])(min, format)) return true; if (max && val > (0, _parseDate2['default'])(max, format)) return true; return false; }; this.togglePicker = function () { var _props4 = _this3.props, onOpen = _props4.onOpen, onClose = _props4.onClose, disabled = _props4.disabled; var openPanel = !_this3.state.openPanel; if (disabled) return; openPanel ? onOpen && onOpen() : onClose && onClose(); _this3.setState({ openPanel: openPanel }); }; }; exports['default'] = WeekPicker;